{"version":3,"sources":["../src/index.ts","../src/config/Config.ts","../src/model/enum/BitType.ts","../src/model/enum/Count.ts","../src/model/enum/ExampleType.ts","../src/model/enum/Tag.ts","../src/model/enum/TagFormat.ts","../src/model/enum/TextFormat.ts","../src/model/config/enum/CardSetConfigKey.ts","../src/model/config/enum/GroupConfigType.ts","../src/model/enum/BitTagConfigKeyType.ts","../src/model/config/AbstractTagConfig.ts","../src/model/config/MarkupTagConfig.ts","../src/model/config/PropertyTagConfig.ts","../src/model/config/ResourceTagConfig.ts","../src/model/config/CardVariantConfig.ts","../src/model/config/CardSideConfig.ts","../src/model/config/CardSetConfig.ts","../src/model/config/BitConfig.ts","../src/model/config/enum/ConfigKey.ts","../src/model/enum/GroupKey.ts","../src/model/enum/PropertyKey.ts","../src/model/enum/ResourceKey.ts","../src/model/enum/ResourceType.ts","../src/utils/StringUtils.ts","../src/model/config/ResourcesConfig.ts","../src/utils/ObjectUtils.ts","../src/config/ConfigHydrator.ts","../src/config/raw/cardSets.ts","../src/config/raw/groups.ts","../src/config/raw/bits.ts","../src/generated/package_info.ts","../src/utils/env/Environment.ts","../src/utils/env/Os.ts","../src/utils/env/userAgent.ts","../src/utils/env/Version.ts","../src/utils/env/Env.ts","../src/init/init.ts","../src/ast/Ast.ts","../src/model/enum/BodyBitType.ts","../src/model/enum/TextMarkType.ts","../src/model/enum/TextNodeType.ts","../src/model/ast/NodeType.ts","../src/ast/Builder.ts","../src/model/enum/TextLocation.ts","../src/model/enum/BodyTextFormat.ts","../src/breakscaping/RegexConfigs.ts","../src/breakscaping/BreakscapeRegex.ts","../src/breakscaping/Breakscape.ts","../src/model/enum/DeprecatedTextFormat.ts","../src/parser/json/TableUtils.ts","../src/utils/ArrayUtils.ts","../src/generator/text/TextGenerator.ts","../src/model/enum/BitmarkVersion.ts","../src/generator/AstWalkerGenerator.ts","../src/generated/parser/text/text-peggy-parser.js","../src/parser/text/peg/TextPegParser.ts","../src/parser/text/TextParser.ts","../src/utils/BooleanUtils.ts","../src/utils/NumberUtils.ts","../src/ast/BaseBuilder.ts","../src/utils/BitUtils.ts","../src/ast/ResourceBuilder.ts","../src/utils/UrlUtils.ts","../src/ast/rules/NodeValidator.ts","../src/ast/writer/StringWriter.ts","../src/BitmarkParserGenerator.ts","../src/generator/bitmark/BitmarkGenerator.ts","../src/model/enum/CardSetVersion.ts","../src/generator/bitmark/BitmarkStringGenerator.ts","../src/generator/html/HtmlTableGenerator.ts","../src/generator/json/JsonGenerator.ts","../src/generator/json/JsonObjectGenerator.ts","../src/info/InfoBuilder.ts","../src/model/enum/BitmarkParserType.ts","../src/model/info/enum/InfoFormat.ts","../src/model/info/enum/InfoType.ts","../src/parser/json/JsonParser.ts","../src/parser/bitmark/peg/BitmarkPegParserTypes.ts","../src/parser/bitmark/peg/PeggyGrammarLocation.ts","../src/parser/bitmark/peg/BitmarkPegParserHelper.ts","../src/parser/bitmark/peg/BitmarkPegParserProcessor.ts","../src/parser/bitmark/peg/BitmarkPegParserValidator.ts","../src/parser/bitmark/peg/contentProcessors/ContentProcessorUtils.ts","../src/parser/bitmark/peg/contentProcessors/BodyContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/CardContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/DefaultTagContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/FooterContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/GapChainContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/ClozeTagContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/ItemLeadChainContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/ItemLeadTagContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/MarkChainContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/MarkTagContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/PropertyContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/BookChainContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/ExampleTagContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/GroupTagChainContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/ImageSourceChainContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/InternalCommentTagContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/MarkConfigChainContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/PersonChainContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/RatingLevelChainContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/ServingsChainContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/TechnicalTermChainContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/ReferenceTagContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/ResourceContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/TitleTagContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/TrueFalseTagContentProcessor.ts","../src/parser/bitmark/peg/contentProcessors/TrueFalseChainContentProcessor.ts","../src/generated/parser/bitmark/bitmark-peggy-parser.js","../src/parser/bitmark/peg/BitmarkPegParser.ts","../src/parser/bitmark/BitmarkParser.ts","../src/parser/html/HtmlDom.ts","../src/parser/html/HtmlTableParser.ts","../src/ast/writer/FileWriter.ts","../src/ast/writer/StreamWriter.ts","../src/generator/bitmark/BitmarkFileGenerator.ts","../src/ast/writer/SyncFileWriter.ts","../src/generator/json/JsonFileGenerator.ts","../src/generator/plainText/PlainTextGenerator.ts","../src/info/ConfigBuilder.ts","../src/generator/json/JsonStringGenerator.ts","../src/utils/BoundingBox.ts"],"sourcesContent":["import { init } from './init/init.ts';\n\nexport { Ast } from './ast/Ast.ts';\nexport { Builder } from './ast/Builder.ts';\nexport { ResourceBuilder } from './ast/ResourceBuilder.ts';\nexport { StringWriter } from './ast/writer/StringWriter.ts';\nexport { BitmarkParserGenerator, Input, InputFormat, Output } from './BitmarkParserGenerator.ts';\nexport { BitmarkGenerator } from './generator/bitmark/BitmarkGenerator.ts';\nexport { BitmarkStringGenerator } from './generator/bitmark/BitmarkStringGenerator.ts';\nexport { JsonGenerator } from './generator/json/JsonGenerator.ts';\nexport { JsonStringGenerator } from './generator/json/JsonStringGenerator.ts';\nexport { NodeType } from './model/ast/NodeType.ts';\nexport { BitmarkParserType } from './model/enum/BitmarkParserType.ts';\nexport { BitmarkVersion } from './model/enum/BitmarkVersion.ts';\nexport { BitType } from './model/enum/BitType.ts';\nexport { BodyTextFormat } from './model/enum/BodyTextFormat.ts';\nexport { CardSetVersion } from './model/enum/CardSetVersion.ts';\nexport { TextMarkType } from './model/enum/TextMarkType.ts';\nexport { TextNodeType } from './model/enum/TextNodeType.ts';\nexport { InfoFormat } from './model/info/enum/InfoFormat.ts';\nexport { InfoType } from './model/info/enum/InfoType.ts';\nexport { BitmarkParser } from './parser/bitmark/BitmarkParser.ts';\nexport { JsonParser } from './parser/json/JsonParser.ts';\nexport { BoundingBoxIndex } from './utils/BoundingBox.ts';\n\n//\n// Direct text parser export\n//\nexport { parse as bitmarkTextParse } from './parser/text/peg/TextPegParser.ts';\n\n//\n// Exports that are stripped out for the browser\n//\n\n/*\n * NOTE:\n *\n * We want to be able to strip out the NodeJS specific functions from the final bundle.\n * Any code between the comments STRIP:START and STRIP:END will be removed.\n *\n * However, the prettifier will move comments that it does not believe are associated with code.\n *\n * Therefore we have to use some dummy code to prevent it from removing the STRIP stripping comments.\n */\nconst STRIP = 0;\n/* STRIP:START */\nSTRIP; // eslint-disable-line @typescript-eslint/no-unused-expressions\n\nexport { FileWriter } from './ast/writer/FileWriter.ts';\nexport { StreamWriter } from './ast/writer/StreamWriter.ts';\nexport { BitmarkFileGenerator } from './generator/bitmark/BitmarkFileGenerator.ts';\nexport { JsonFileGenerator } from './generator/json/JsonFileGenerator.ts';\n\n/* STRIP:END */\nSTRIP; // eslint-disable-line @typescript-eslint/no-unused-expressions\n\n//\n// Type only exports\n//\n\nexport type { AstWalkCallbacks, NodeInfo } from './ast/Ast.ts';\nexport type { FileOptions } from './ast/writer/FileWriter.ts';\nexport { type Writer } from './ast/writer/Writer.ts';\nexport type {\n  BreakscapeOptions,\n  ConvertHtmlTableOptions,\n  ConvertOptions,\n  ConvertTextOptions,\n  CreateAstOptions,\n  InfoOptions,\n  InputFormatType,\n  InputType,\n  OutputType,\n  UpgradeOptions as PrettifyOptions,\n  TextJsonOptions,\n  UnbreakscapeOptions,\n  UpgradeOptions,\n} from './BitmarkParserGenerator.ts';\nexport type { BitmarkOptions } from './generator/bitmark/BitmarkGenerator.ts';\nexport type { Generator } from './generator/Generator.ts';\nexport { HtmlTableGenerator } from './generator/html/HtmlTableGenerator.ts';\nexport type { JsonOptions } from './generator/json/JsonGenerator.ts';\nexport { type BreakscapedString } from './model/ast/BreakscapedString.ts';\nexport type {\n  Bit,\n  BitmarkAst,\n  Body,\n  BodyPart,\n  CardBit,\n  CardNode,\n  Example,\n  ExtraProperties,\n  Footer,\n  Node,\n  Property,\n} from './model/ast/Nodes.ts';\nexport type { NodeTypeType } from './model/ast/NodeType.ts';\nexport type {\n  CodeBlockTextNode,\n  CodeBlockTextNodeAttributes,\n  CommentMark,\n  ExtRefMark,\n  ExtRefMarkAttibutes,\n  FootnoteAttibutes,\n  FootnoteMark,\n  HeadingTextNode,\n  HeadingTextNodeAttributes,\n  ImageInlineTextNode,\n  ImageTextNode,\n  ImageTextNodeAttributes,\n  LatexTextNode,\n  LatexTextNodeAttributes,\n  LinkMark,\n  LinkMarkAttibutes,\n  ListTextNode,\n  ListTextNodeAttributes,\n  MediaAttributes,\n  RefMark,\n  RefMarkAttibutes,\n  SectionTextNode,\n  SymbolMark,\n  TaskItemTextNode,\n  TaskItemTextNodeAttributes,\n  JsonText as Text,\n  TextAst,\n  TextMark,\n  TextMarkAttibutes,\n  TextNode,\n  TextNodeAttibutes,\n  XRefMark,\n  XRefMarkAttibutes,\n} from './model/ast/TextNodes.ts';\nexport type { BitmarkParserTypeType } from './model/enum/BitmarkParserType.ts';\nexport type { BitmarkVersionType } from './model/enum/BitmarkVersion.ts';\nexport type { BitTypeType } from './model/enum/BitType.ts';\nexport type { BodyTextFormatType } from './model/enum/BodyTextFormat.ts';\nexport type { CardSetVersionType } from './model/enum/CardSetVersion.ts';\nexport type { ResourceTypeType } from './model/enum/ResourceType.ts';\nexport type { TextMarkTypeType } from './model/enum/TextMarkType.ts';\nexport type { TextNodeTypeType } from './model/enum/TextNodeType.ts';\nexport type { InfoFormatType } from './model/info/enum/InfoFormat.ts';\nexport type { InfoTypeType } from './model/info/enum/InfoType.ts';\nexport type {\n  BitJson,\n  BookJson,\n  BookReferenceJson,\n  BotResponseJson,\n  ChoiceJson,\n  DefinitionListItemJson,\n  ExampleJson,\n  FeedbackChoiceJson,\n  FeedbackJson,\n  FeedbackReasonJson,\n  FlashcardJson,\n  GroupTagJson,\n  HeadingJson,\n  ImageSourceJson,\n  IngredientJson,\n  ListItemJson,\n  MarkConfigJson,\n  MatrixCellJson,\n  MatrixJson,\n  PairJson,\n  PersonJson,\n  PronunciationTableCellJson,\n  PronunciationTableJson,\n  QuestionJson,\n  QuizJson,\n  RatingLevelStartEndJson,\n  ResponseJson,\n  ServingsJson,\n  StatementJson,\n  TableCellJson,\n  TableExtendedJson,\n  TableJson,\n  TableRowJson,\n  TableSectionJson,\n  TechnicalTermJson,\n  TextAndIconJson,\n} from './model/json/BitJson.ts';\nexport type { BitWrapperJson } from './model/json/BitWrapperJson.ts';\nexport type {\n  BodyBitJson,\n  BodyBitsJson,\n  GapJson,\n  HighlightJson,\n  HighlightTextJson,\n  MarkJson,\n  SelectJson,\n  SelectOptionJson,\n} from './model/json/BodyBitJson.ts';\nexport type { ParserJson } from './model/json/ParserJson.ts';\nexport type {\n  AppLinkResourceJson,\n  AppLinkResourceWrapperJson,\n  ArticleResourceJson,\n  ArticleResourceWrapperJson,\n  AudioEmbedResourceJson,\n  AudioEmbedResourceWrapperJson,\n  AudioLinkResourceJson,\n  AudioLinkResourceWrapperJson,\n  AudioResourceJson,\n  AudioResourceWrapperJson,\n  DocumentDownloadResourceJson,\n  DocumentDownloadResourceWrapperJson,\n  DocumentEmbedResourceJson,\n  DocumentEmbedResourceWrapperJson,\n  DocumentLinkResourceJson,\n  DocumentLinkResourceWrapperJson,\n  DocumentResourceJson,\n  DocumentResourceWrapperJson,\n  ImageLinkResourceJson,\n  ImageLinkResourceWrapperJson,\n  ImageResourceJson,\n  ImageResourceWrapperJson,\n  ResourceDataJson,\n  ResourceJson,\n  ResourceWrapperJson,\n  StillImageFilmEmbedResourceJson,\n  StillImageFilmEmbedResourceWrapperJson,\n  StillImageFilmLinkResourceJson,\n  StillImageFilmLinkResourceWrapperJson,\n  StillImageFilmResourceJson,\n  StillImageFilmResourceWrapperJson,\n  VideoEmbedResourceJson,\n  VideoEmbedResourceWrapperJson,\n  VideoLinkResourceJson,\n  VideoLinkResourceWrapperJson,\n  VideoResourceJson,\n  VideoResourceWrapperJson,\n  WebsiteLinkResourceJson,\n  WebsiteLinkResourceWrapperJson,\n} from './model/json/ResourceJson.ts';\nexport {\n  type HtmlTableFormat,\n  type HtmlTableParseOptions,\n  HtmlTableParser,\n} from './parser/html/HtmlTableParser.ts';\nexport type { Bbox, BoundingBoxEntry, FromBitsOptions } from './utils/BoundingBox.ts';\n\n// Initialise the application\ninit();\n","import { Enum } from '@ncoderz/superenum';\n\nimport { type _BitConfig, type _PropertiesConfig } from '../model/config/_Config.ts';\nimport { BitConfig } from '../model/config/BitConfig.ts';\nimport type { CardVariantConfig } from '../model/config/CardVariantConfig.ts';\nimport { ConfigKey, type ConfigKeyType } from '../model/config/enum/ConfigKey.ts';\nimport { GroupConfigType } from '../model/config/enum/GroupConfigType.ts';\nimport { ResourcesConfig } from '../model/config/ResourcesConfig.ts';\nimport { ResourceTagConfig } from '../model/config/ResourceTagConfig.ts';\nimport { type TagConfig } from '../model/config/TagConfig.ts';\nimport { type TagsConfig } from '../model/config/TagsConfig.ts';\nimport { BitTagConfigKeyType } from '../model/enum/BitTagConfigKeyType.ts';\nimport { BitType, type BitTypeType } from '../model/enum/BitType.ts';\nimport { Count } from '../model/enum/Count.ts';\nimport type { ResourceKeyType } from '../model/enum/ResourceKey.ts';\nimport { resourceTypeToConfigKey, type ResourceTypeType } from '../model/enum/ResourceType.ts';\nimport { TagFormat } from '../model/enum/TagFormat.ts';\nimport { TextFormat } from '../model/enum/TextFormat.ts';\nimport { ObjectUtils } from '../utils/ObjectUtils.ts';\nimport { ConfigHydrator } from './ConfigHydrator.ts';\nimport { BITS } from './raw/bits.ts';\nimport { GROUPS } from './raw/groups.ts';\n\n/**\n * PLAN-017: suffix identifying the deprecated collapsible bit types.\n */\nconst COLLAPSIBLE_BIT_TYPE_SUFFIX = '-collapsible';\n\nexport interface ComboResources {\n  [configKey: string]: TagsConfig;\n}\n\nclass Config {\n  public bitLevelMin = 1;\n  public bitLevelMax = 7;\n  private bitCache: Map<BitTypeType, BitConfig> = new Map();\n  private migratedBitCache: Map<BitTypeType, BitTypeType | undefined> = new Map();\n  private allResourcesCache: TagsConfig | undefined;\n  private comboResourcesCache: Map<ConfigKeyType, TagsConfig | undefined> = new Map();\n\n  constructor() {\n    //\n  }\n\n  /**\n   * Return the bitType given a bit type that may be invalid\n   *\n   * If the bit type is not found, the _error bit type will be returned.\n   *\n   * @param bitType bit type in (may be invalid)\n   * @returns valid bitType, or _error if the bit type is invalid\n   */\n  public getBitType(bitType: BitTypeType | string | undefined): BitTypeType {\n    if (bitType?.startsWith('|')) bitType = bitType.substring(1);\n    return Enum(BitType).fromValue(bitType) ?? BitType._error;\n  }\n\n  /**\n   * PLAN-017: Return the migration target for a deprecated `*-collapsible` bit type.\n   *\n   * Every `*-collapsible` bit type declares its non-collapsible cousin as its `baseBitType`, so the\n   * target is read from the config rather than a hand-maintained table — a new `*-collapsible` bit\n   * type is covered automatically.\n   *\n   * `BitType.collapsible` is the one exclusion: it has no non-collapsible cousin (its `baseBitType`\n   * is `article`, which is not a migration target).\n   *\n   * @param bitType the bit type\n   * @returns the bit type to migrate to, or undefined if the bit type does not migrate\n   */\n  public getMigratedBitType(bitType: BitTypeType): BitTypeType | undefined {\n    const cached = this.migratedBitCache.get(bitType);\n    if (cached !== undefined || this.migratedBitCache.has(bitType)) return cached;\n\n    let target: BitTypeType | undefined;\n    if (bitType !== BitType.collapsible && bitType.endsWith(COLLAPSIBLE_BIT_TYPE_SUFFIX)) {\n      target = BITS[bitType]?.baseBitType;\n    }\n\n    this.migratedBitCache.set(bitType, target);\n    return target;\n  }\n\n  /**\n   * Check if a bit type is and instance of the given root bit type.\n   *\n   * @param bitType the bit type\n   * @param baseBitType the root bit type or types to check\n   */\n  public isOfBitType(\n    bitType: BitTypeType | undefined,\n    baseBitType: BitTypeType | BitTypeType[],\n  ): boolean {\n    if (!bitType) return false;\n    if (bitType === baseBitType) return true;\n    const bitConfig = this.getBitConfig(bitType);\n    if (!bitConfig) return false;\n\n    if (Array.isArray(baseBitType)) {\n      for (const bt of baseBitType) {\n        if (bitConfig.inheritedBitTypesSet.has(bt)) return true;\n      }\n      return false;\n    }\n\n    return bitConfig.inheritedBitTypesSet.has(baseBitType);\n  }\n\n  /**\n   * Return true if the bit type is commented.\n   *\n   * @param bitType bit type in (may be invalid)\n   * @returns true if the bit type is commented\n   */\n  public isBitTypeCommented(bitType: string | undefined): boolean {\n    return !!bitType?.startsWith('|');\n  }\n\n  /**\n   * Get the configuration for a bit.\n   *\n   * @param bitType\n   * @returns the bit configuration\n   */\n  public getBitConfig(bitType: BitTypeType): BitConfig {\n    let bitConfig = this.bitCache.get(bitType);\n    if (!bitConfig) {\n      const throwNotFoundError = () => {\n        throw new Error(`No config found for bit: ${bitType}`);\n      };\n\n      // Get the bit configs, following the inheritance tree\n      const inheritedBitTypes: BitTypeType[] = [];\n      const _bitConfigTree: _BitConfig[] = [];\n      let bitTypeCurrent: BitTypeType | undefined = bitType;\n      while (bitTypeCurrent) {\n        const _bitConfig: _BitConfig = BITS[bitTypeCurrent];\n        if (!_bitConfig) throwNotFoundError();\n\n        inheritedBitTypes.push(bitTypeCurrent);\n        _bitConfigTree.push(_bitConfig);\n        bitTypeCurrent = _bitConfig.baseBitType;\n      }\n\n      // Reverse the tree so that the root is first\n      _bitConfigTree.reverse();\n\n      // Loop the tree, merging the configs\n      const _mergedBitConfig: _BitConfig = _bitConfigTree.reduce((acc, cur) => {\n        acc = ObjectUtils.deepMerge(acc, cur);\n        return acc;\n      }, {} as _BitConfig);\n\n      // Extract the root config\n      const {\n        since,\n        textFormatDefault,\n        quizBit,\n        tags: _tags,\n        cardSet: _cardSet,\n        deprecated,\n        bodyAllowed,\n        bodyRequired,\n        footerAllowed,\n        footerRequired,\n        resourceAttachmentAllowed,\n        rootExampleType,\n      } = _mergedBitConfig;\n\n      // All bits have the internal comment property, so add it to the tags\n      _tags?.push({\n        key: ConfigKey.property_internalComment,\n        description: 'Internal comment for the bit.',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n        minCount: 0,\n      });\n\n      // Hydrate the configuration\n      const zeroCountAllResourcesTags = this.getAllResourcesTagsWithZeroCounts();\n      const bitTags = ConfigHydrator.hydrateTagsConfig(_tags ?? []);\n      const cardSet = ConfigHydrator.hydrateCardSetConfig(_cardSet);\n\n      // Merge the allResourcesTags with the bitTags *in the correct order*\n      const comboResourceConfigKey = bitTags.info?.comboResourceConfigKey;\n      const tags = {\n        ...bitTags.tags,\n      };\n      for (const [k, v] of Object.entries(zeroCountAllResourcesTags)) {\n        if (!tags[k]) tags[k] = v;\n      }\n\n      // Create the bit config\n      bitConfig = new BitConfig({\n        since,\n        bitType,\n        inheritedBitTypes,\n        textFormatDefault: textFormatDefault ?? TextFormat.bitmarkText,\n        tags,\n        cardSet,\n        quizBit,\n        deprecated,\n        bodyAllowed,\n        bodyRequired,\n        footerAllowed,\n        footerRequired,\n        resourceAttachmentAllowed,\n        rootExampleType,\n        comboResourceConfigKey,\n      });\n\n      // Add to cache\n      this.bitCache.set(bitType, bitConfig);\n    }\n\n    return bitConfig;\n  }\n\n  /**\n   * Look up the tag configuration by tag (rather than by config key).\n   *\n   * @param bitType\n   * @param key the configKey to look up - if undefined, will return undefined\n   * @returns\n   */\n  public getTagConfigForTag(\n    tagsConfig: TagsConfig | undefined,\n    key: ConfigKeyType | undefined,\n  ): TagConfig | undefined {\n    if (!tagsConfig) return undefined;\n\n    // // Search the properties in the bit config for the matching tag.\n    // for (const [, t] of Object.entries(tagsConfig)) {\n    //   if (t.tag === tag) {\n    //     return t;\n    //   }\n    // }\n\n    // return undefined;\n\n    // Now a map lookup since the tag now has the & / @ prefix\n    return tagsConfig[key as string];\n  }\n\n  /**\n   * Look up the tag configuration for a cardSet variant.\n   *\n   * @param bitType\n   * @param sideNo\n   * @param variantNo\n   * @param tag\n   * @param parentTagConfig\n   * @returns\n   */\n  public getTagsConfigForCardSet(\n    bitType: BitTypeType,\n    sideNo: number,\n    variantNo: number,\n  ): TagsConfig | undefined {\n    const variantConfig = this.getCardSetVariantConfig(bitType, sideNo, variantNo);\n    if (!variantConfig) return undefined;\n\n    return variantConfig.tags;\n  }\n\n  /**\n   * Get the configuration for a particular card side and variant\n   * (checking for infinitely repeating variants)\n   *\n   * @param config all variant configurations\n   * @param sideNo side index\n   * @param variantNo variant index\n   *\n   * @returns the config if found, otherwise undefined\n   */\n  public getCardSetVariantConfig(\n    bitType: BitTypeType,\n    sideNo: number,\n    variantNo: number,\n  ): CardVariantConfig | undefined {\n    let ret: CardVariantConfig | undefined;\n\n    const bitConfig = this.getBitConfig(bitType);\n    if (!bitConfig) return undefined;\n    const variants = bitConfig.cardSet?.variants;\n    if (!variants) return undefined;\n\n    const sideIdx = Math.min(sideNo, variants.length - 1);\n    const variant = variants[sideIdx];\n\n    // Check for variant\n    const maxVariantIndex = variant.length - 1;\n    if (variantNo > maxVariantIndex) {\n      ret = variant[maxVariantIndex];\n      // Fix: Always assume infinite repeat count\n      // if (ret.repeatCount !== Count.infinity) return undefined;\n    } else {\n      ret = variant[variantNo];\n    }\n\n    return ret;\n  }\n\n  /**\n   * Get the resource configuration for a bit.\n   *\n   * The configuration returned potentially depends on the resourceTypeAttachment which can change the allowed\n   * count of the resource (or comboResource) it matches.\n   *\n   * The function is a bit complicated, but it is actually just manipulating the configuration into a format that\n   * the rest of the app can use easily.\n   *\n   * @param bitType\n   * @param resourceTypeAttachment the resource type specified in the bit header\n   * @returns the definitive resource configuration for the bit\n   */\n  // TODO - this will need fixing.\n  public getBitResourcesConfig(\n    bitType: BitTypeType,\n    resourceTypeAttachment: ResourceTypeType | undefined,\n  ): ResourcesConfig {\n    let finalResourceTags: TagsConfig = {};\n    const comboResourceConfigKeysMap: Map<ConfigKeyType, ConfigKeyType[]> = new Map();\n    const configKeyResourceAttachment = resourceTypeAttachment\n      ? resourceTypeToConfigKey(resourceTypeAttachment)\n      : undefined;\n\n    const bitConfig = this.getBitConfig(bitType);\n\n    // Filter out the resource tags\n    const resourceTags: TagsConfig = {};\n    for (const [k, v] of Object.entries(bitConfig.tags)) {\n      if (v.type === BitTagConfigKeyType.resource) {\n        resourceTags[k] = v;\n      }\n    }\n\n    // Work out the potential combo resource type, which is either fixed by the bit type, or comes from the bit header\n    const comboResourceConfigKey =\n      bitConfig.comboResourceConfigKey ??\n      (bitConfig.resourceAttachmentAllowed ? configKeyResourceAttachment : undefined);\n\n    if (comboResourceConfigKey) {\n      // The comboResourceConfigKey might be a combo resource. Build the comborResourceTagTypesMap\n      const comboResourcesMap: Map<ConfigKeyType, TagConfig> = new Map();\n\n      // The resource type attachment might be a combo resource - handle it\n      const comboResource = this.getComboResource(comboResourceConfigKey);\n      if (comboResource) {\n        // Extract the resource types from the combo resource\n        const comboResourceTagConfigs = Object.values(comboResource).filter((t) => {\n          return t.type === BitTagConfigKeyType.resource;\n        });\n        const comboResourceTypes = comboResourceTagConfigs.map((t) => t.configKey);\n\n        // Combine into a map for easy lookup\n        comboResourceTypes.forEach((type) => {\n          const tags = comboResourceTagConfigs.find((t) => t.configKey === type);\n          if (tags) comboResourcesMap.set(type, tags);\n        });\n\n        // If the resource tag is a combo resource tag, then add it to the comboResourceConfigKeysMap\n        const comboResourceConfigKeys = this.getComboResourceConfigKeys(comboResourceConfigKey);\n        if (comboResourceConfigKeys && comboResourceConfigKeys.length > 0) {\n          comboResourceConfigKeysMap.set(comboResourceConfigKey, comboResourceConfigKeys);\n        }\n      }\n\n      // If the resource is an attachment...\n      // Modify the count for the resource that matched the resource type attachment\n      // (create a copy so as not to modify the original configuration)\n      if (resourceTypeAttachment) {\n        for (const [k, tag] of Object.entries(resourceTags)) {\n          // Check if the tag matches the resource type attachment or the comboResource\n          const singleTagMatch = comboResourceConfigKey === tag.configKey;\n          const comboTagMatch = comboResourcesMap\n            ? comboResourcesMap.has(tag.configKey as ResourceKeyType)\n            : false;\n\n          if (singleTagMatch) {\n            // Single tag match for a resource specified in the bit header\n            const newTag = new ResourceTagConfig({\n              configKey: tag.configKey,\n              tag: tag.tag,\n              minCount: 1,\n              maxCount: 1,\n              chain: tag.chain,\n              jsonKey: tag.jsonKey,\n              exportJsonKey: tag.exportJsonKey,\n              hasExportJsonKey: tag.hasExportJsonKey,\n              htmlKey: tag.htmlKey,\n              hasHtmlKey: tag.hasHtmlKey,\n              deprecated: tag.deprecated,\n            });\n            finalResourceTags[k] = newTag;\n          } else if (comboTagMatch) {\n            // Combo resource tag match for a resource specified in the bit header\n            if (comboResourcesMap) {\n              const newTag = comboResourcesMap.get(tag.configKey as ResourceKeyType);\n              if (newTag) finalResourceTags[k] = newTag;\n            }\n          } else {\n            finalResourceTags[k] = tag;\n          }\n        }\n      } else {\n        // Combo resource, but not a resource type attachement\n        finalResourceTags = resourceTags;\n      }\n    } else {\n      // No combo resource and no resource type attachment\n      finalResourceTags = resourceTags;\n    }\n\n    const resourcesConfig = new ResourcesConfig(\n      finalResourceTags,\n      bitConfig.resourceAttachmentAllowed,\n      configKeyResourceAttachment,\n      comboResourceConfigKeysMap,\n    );\n\n    return resourcesConfig;\n  }\n\n  /**\n   * Get the resourceType tags for a combo resource.\n   *\n   * @param configKeyResourceAttachment\n   * @returns resourceTypes for the combo resource (or undefined if not a combo resource)\n   */\n  private getComboResourceConfigKeys(\n    configKeyResourceAttachment: ConfigKeyType | undefined,\n  ): ConfigKeyType[] | undefined {\n    const comboResource = this.getComboResource(configKeyResourceAttachment);\n    if (comboResource) {\n      const comboResourceTypes = Object.values(comboResource)\n        .filter((t) => {\n          return t.type === BitTagConfigKeyType.resource;\n        })\n        .map((t) => t.configKey);\n\n      return comboResourceTypes;\n    }\n    return undefined;\n  }\n\n  /**\n   * Get the tags for a combo resource.\n   *\n   * Combo resources are resources that contain more than one resource, such as still-image-film.\n   * These resources require special handling in the code and therefore also special configuration.\n   *\n   * @returns TagsConfig for the combo resource or undefined if not found\n   */\n  private getComboResource(resourceConfigKey: ConfigKeyType | undefined): TagsConfig | undefined {\n    if (!resourceConfigKey) return undefined;\n\n    let comboResourcesTags = this.comboResourcesCache.get(resourceConfigKey);\n    if (!comboResourcesTags) {\n      // Filter for all the resource groups and hydrate the tags\n      comboResourcesTags = {};\n      Object.values(GROUPS)\n        .filter(\n          (g) =>\n            g.type === GroupConfigType.comboResource &&\n            g.comboResourceConfigKey === resourceConfigKey,\n        )\n        .forEach((g) => {\n          comboResourcesTags = {\n            ...comboResourcesTags,\n            ...ConfigHydrator.hydrateTagsConfig(g.tags).tags,\n          };\n        });\n\n      // Add to cache\n      if (Object.keys(comboResourcesTags).length === 0) comboResourcesTags = undefined;\n      this.comboResourcesCache.set(resourceConfigKey, comboResourcesTags);\n    }\n\n    return comboResourcesTags;\n  }\n\n  /**\n   * Get the tags for all resources with 0 max/min counts.\n   *\n   * This is required so that any bit can parse all resources correctly. It is necessary to parse all resources\n   * for any bit because of the requirement to add excess resources to the 'parser' output.\n   *\n   * NOTE: These are not used for validation, only for parsing. They will be overridden for individual bits for\n   * validation.\n   *\n   * @returns TagsConfig for all resources\n   */\n  private getAllResourcesTagsWithZeroCounts(): TagsConfig {\n    let allResourcesTags = this.allResourcesCache;\n    if (!allResourcesTags) {\n      // Filter for all the resource groups and hydrate the tags\n      allResourcesTags = {};\n      Object.values(GROUPS)\n        .filter((g) => g.type === GroupConfigType.resource)\n        .forEach((g) => {\n          allResourcesTags = {\n            ...allResourcesTags,\n            ...ConfigHydrator.hydrateTagsConfig(g.tags).tags,\n          };\n        });\n\n      // Ensure the minimum and maximum counts are all set to 0\n      // We only use this config to understand how to parse, not to validate\n      for (const tag of Object.values(allResourcesTags)) {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        const tagAny = tag as any;\n        tagAny.maxCount = 0;\n        tagAny.minCount = 0;\n      }\n\n      // Add to cache\n      this.allResourcesCache = allResourcesTags;\n    }\n\n    return allResourcesTags;\n  }\n}\n\nconst instance = new Config();\n\nexport { instance as Config };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst BitType = {\n  _error: '_error', // Used for error handling to indicate a bit type that is not supported or a bit parse error\n  _comment: '_comment', // Used to indicate a bit is commented out\n  _standard: '_standard', // Not to be used as a bit, but as a base for other bit types\n  advertising: 'advertising',\n  advertisingAdvertorial: 'advertising-advertorial',\n  advertisingAdvertorialPage: 'advertising-advertorial-page',\n  advertisingCallToAction: 'advertising-call-to-action',\n  advertisingCallToActionMeeting: 'advertising-call-to-action-meeting',\n  advertisingBanner: 'advertising-banner',\n  advertisingSkyscraper: 'advertising-skyscraper',\n  advertisingRectangle: 'advertising-rectangle',\n  advertisingFullPage: 'advertising-full-page',\n  advertisingHalfPage: 'advertising-half-page',\n  advertisingQuarterPage: 'advertising-quarter-page',\n  advertisingClassifiedPage: 'advertising-classified-page',\n  advertisingLandscape: 'advertising-landscape',\n  advertisingPortrait: 'advertising-portrait',\n  aiChat: 'ai-chat',\n  aiEditor: 'ai-editor',\n  aiPrompt: 'ai-prompt',\n  aiTutor: 'ai-tutor',\n  aiWbt: 'ai-wbt',\n  anchor: 'anchor',\n  appAiPrompt: 'app-ai-prompt',\n  appBitmarkFromEditor: 'app-bitmark-from-editor',\n  appBitmarkFromJavascript: 'app-bitmark-from-javascript',\n  appCalculatorLatex: 'app-calculator-latex',\n  appCodeCell: 'app-code-cell',\n  appCodeEditor: 'app-code-editor',\n  appCodeIde: 'app-code-ide',\n  appCreateBitsFromImage: 'app-create-bits-from-image',\n  appFlashcards: 'app-flashcards',\n  appFlashcardsLearn: 'app-flashcards-learn',\n  appFlashcardsQuiz: 'app-flashcards-quiz',\n  appGetScreenshot: 'app-get-screenshot',\n  appLink: 'app-link',\n  appRag: 'app-rag',\n  appSearch: 'app-search',\n  article: 'article',\n  articleAi: 'article-ai',\n  articleAlt: 'article-alt',\n  articleAttachment: 'article-attachment',\n  articleAuthor: 'article-author',\n  articleEmbed: 'article-embed',\n  articleLink: 'article-link',\n  articleResponsive: 'article-responsive',\n  articleResponsiveAlt: 'article-responsive-alt',\n  assignment: 'assignment',\n  assignmentList: 'assignment-list',\n  audio: 'audio',\n  audioEmbed: 'audio-embed',\n  audioLink: 'audio-link',\n  audioTranscript: 'audio-transcript',\n  author: 'author',\n  authorContentBitGenerator: 'author-content-bit-generator',\n  bitAlias: 'bit-alias',\n  bitBookEnding: 'bit-book-ending',\n  bitBookSummary: 'bit-book-summary',\n  bitmarkExample: 'bitmark-example',\n  blogArticle: 'blog-article',\n  book: 'book',\n  bookAcknowledgements: 'book-acknowledgements',\n  bookAddendum: 'book-addendum',\n  bookAfterword: 'book-afterword',\n  bookAlias: 'book-alias',\n  bookAppendix: 'book-appendix',\n  bookArticle: 'book-article',\n  bookAuthor: 'book-author',\n  bookAutherBio: 'book-author-bio',\n  bookBibliography: 'book-bibliography',\n  bookClose: 'book-close',\n  bookComingSoon: 'book-coming-soon',\n  bookConclusion: 'book-conclusion',\n  bookCopyright: 'book-copyright',\n  bookCopyrightPermissions: 'book-copyright-permissions',\n  bookCover: 'book-cover',\n  bookDedication: 'book-dedication',\n  bookDiff: 'book-diff',\n  bookEnd: 'book-end',\n  bookEndnotes: 'book-endnotes',\n  bookEpigraph: 'book-epigraph',\n  bookEpilogue: 'book-epilogue',\n  bookForword: 'book-foreword',\n  bookFrontispiece: 'book-frontispiece',\n  bookImprint: 'book-imprint',\n  bookIncitingIncident: 'book-inciting-incident',\n  bookIntroduction: 'book-introduction',\n  bookLink: 'book-link',\n  bookLinkNext: 'book-link-next',\n  bookLinkPrev: 'book-link-prev',\n  bookListOfContributors: 'book-list-of-contributors',\n  bookNotes: 'book-notes',\n  bookPostscript: 'book-postscript',\n  bookPreface: 'book-preface',\n  bookPrologue: 'book-prologue',\n  bookReadMore: 'book-read-more',\n  bookReference: 'book-reference',\n  bookReferenceList: 'book-reference-list',\n  bookRequestForABookReview: 'book-request-for-a-book-review',\n  bookSummary: 'book-summary',\n  bookTeaser: 'book-teaser',\n  bookTitle: 'book-title',\n  botActionAnnounce: 'bot-action-announce',\n  botActionRatingNumber: 'bot-action-rating-number',\n  botActionRemind: 'bot-action-remind',\n  botActionResponse: 'bot-action-response',\n  botActionSave: 'bot-action-save',\n  botActionSend: 'bot-action-send',\n  botActionTrueFalse: 'bot-action-true-false',\n  botInterview: 'bot-interview',\n  brandColor: 'brand-color',\n  browserImage: 'browser-image',\n  bug: 'bug',\n  bugAlt: 'bug-alt',\n  bugCollapsible: 'bug-collapsible',\n  buttonCopyText: 'button-copy-text',\n  catalogItemBook: 'catalog-item-book',\n  catalogItemExternalBook: 'catalog-item-external-book',\n  catalogItemProduct: 'catalog-item-product',\n  callToAction: 'call-to-action',\n  callToActionBookNow: 'call-to-action-book-now',\n  callToActionContact: 'call-to-action-contact',\n  callToActionCreateAccount: 'call-to-action-create-account',\n  callToActionDownload: 'call-to-action-download',\n  callToActionGetNow: 'call-to-action-get-now',\n  callToActionGetOffer: 'call-to-action-get-offer',\n  callToActionJoin: 'call-to-action-join',\n  callToActionLearnMore: 'call-to-action-learn-more',\n  callToActionMail: 'call-to-action-mail',\n  callToActionSeeMore: 'call-to-action-see-more',\n  callToActionShopNow: 'call-to-action-shop-now',\n  callToActionStartNow: 'call-to-action-start-now',\n  callToActionSubscribe: 'call-to-action-subscribe',\n  callToActionWatch: 'call-to-action-watch',\n  card1: 'card-1',\n  chapter: 'chapter',\n  chapterSubjectMatter: 'chapter-subject-matter',\n  chat: 'chat',\n  checklist: 'checklist',\n  cloze: 'cloze',\n  clozeAndMultipleChoiceText: 'cloze-and-multiple-choice-text',\n  clozeInstructionGrouped: 'cloze-instruction-grouped',\n  clozeList: 'cloze-list',\n  clozeSeveral: 'cloze-several',\n  clozeSolutionGrouped: 'cloze-solution-grouped',\n  coachAudioTranscript: 'coach-audio-transcript',\n  coachCallToActionChecklist: 'coach-call-to-action-checklist',\n  coachCallToActionCloze: 'coach-call-to-action-cloze',\n  coachCallToActionClozeAndMultipleChoiceText:\n    'coach-call-to-action-cloze-and-multiple-choice-text',\n  coachCallToActionEssay: 'coach-call-to-action-essay',\n  coachCallToActionMultipleChoiceText: 'coach-call-to-action-multiple-choice-text',\n  coachHomeRules: 'coach-home-rules',\n  coachSelfReflectionCloze: 'coach-self-reflection-cloze',\n  coachSelfReflectionEssay: 'coach-self-reflection-essay',\n  coachSelfReflectionMultipleChoice: 'coach-self-reflection-multiple-choice',\n  coachSelfReflectionMultipleChoice1: 'coach-self-reflection-multiple-choice-1',\n  coachSelfReflectionMultipleChoiceText: 'coach-self-reflection-multiple-choice-text',\n  coachSelfReflectionMultipleResponse: 'coach-self-reflection-multiple-response',\n  coachSelfReflectionMultipleResponse1: 'coach-self-reflection-multiple-response-1',\n  coachSelfReflectionRating: 'coach-self-reflection-rating',\n  coachVideoTranscript: 'coach-video-transcript',\n  code: 'code',\n  codeRuntime: 'code-runtime',\n  collapsible: 'collapsible',\n  conclusion: 'conclusion',\n  conclusionAlt: 'conclusion-alt',\n  consoleLog: 'console-log',\n  container: 'container',\n  containerAccordionTabs: 'container-accordion-tabs',\n  containerBits2: 'container-bits-2',\n  containerCards: 'container-cards',\n  containerCarousel: 'container-carousel',\n  containerCookRecipe: 'container-cook-recipe',\n  containerFolder: 'container-folder',\n  containerFolderAll: 'container-folder-all',\n  containerGallery: 'container-gallery',\n  containerGrid: 'container-grid',\n  containerGroup: 'container-group',\n  containerNewsArticle: 'container-news-article',\n  containerNowrap: 'container-nowrap',\n  containerNowrapStretch: 'container-nowrap-stretch',\n  containerPreview: 'container-preview',\n  containerScroller: 'container-scroller',\n  containerSlides: 'container-slides',\n  containerStack: 'container-stack',\n  containerTabs: 'container-tabs',\n  containerWrap: 'container-wrap',\n  conversationLeft1: 'conversation-left-1',\n  conversationLeft1Scream: 'conversation-left-1-scream',\n  conversationLeft1Thought: 'conversation-left-1-thought',\n  conversationRight1: 'conversation-right-1',\n  conversationRight1Scream: 'conversation-right-1-scream',\n  conversationRight1Thought: 'conversation-right-1-thought',\n  clozeAndMultipleChoiceTextConversationLeft1: 'cloze-and-multiple-choice-text-conversation-left-1',\n  clozeAndMultipleChoiceTextConversationLeft1Scream:\n    'cloze-and-multiple-choice-text-conversation-left-1-scream',\n  clozeAndMultipleChoiceTextConversationLeft1Thought:\n    'cloze-and-multiple-choice-text-conversation-left-1-thought',\n  clozeAndMultipleChoiceTextConversationRight1:\n    'cloze-and-multiple-choice-text-conversation-right-1',\n  clozeAndMultipleChoiceTextConversationRight1Scream:\n    'cloze-and-multiple-choice-text-conversation-right-1-scream',\n  clozeAndMultipleChoiceTextConversationRight1Thought:\n    'cloze-and-multiple-choice-text-conversation-right-1-thought',\n  cookArrangement: 'cook-arrangement',\n  cookIngredients: 'cook-ingredients',\n  cookInsert: 'cook-insert',\n  cookNoteOnQuantity: 'cook-note-on-quantity',\n  cookPersonalRecommendation: 'cook-personal-recommendation',\n  cookPlate: 'cook-plate',\n  cookPracticeAdvise: 'cook-practice-advise',\n  cookPreparation: 'cook-preparation',\n  cookRecommendation: 'cook-recommendation',\n  cookRemark: 'cook-remark',\n  cookSideDish: 'cook-side-dish',\n  cookSideDrink: 'cook-side-drink',\n  cookStep: 'cook-step',\n  cookTimer: 'cook-timer',\n  cookVariation: 'cook-variation',\n  correction: 'correction',\n  danger: 'danger',\n  dangerAlt: 'danger-alt',\n  dangerCollapsible: 'danger-collapsible',\n  definitionList: 'definition-list',\n  definitionListCollapsible: 'definition-list-collapsible',\n  definitionTerm: 'definition-term',\n  deleted: 'deleted',\n  details: 'details',\n  details1: 'details-1',\n  detailsImage: 'details-image',\n  diff: 'diff',\n  document: 'document',\n  documentDownload: 'document-download',\n  documentEmbed: 'document-embed',\n  documentLink: 'document-link',\n  documentUpload: 'document-upload',\n  editorial: 'editorial',\n  editorNote: 'editor-note',\n  essay: 'essay',\n  example: 'example',\n  exampleAlt: 'example-alt',\n  exampleCollapsible: 'example-collapsible',\n  exampleList: 'example-list',\n  extractorAiChat: 'extractor-ai-chat',\n  extractorBlock: 'extractor-block',\n  extractorBlueprint: 'extractor-blueprint',\n  extractorBlueprintConfiguration: 'extractor-blueprint-configuration',\n  extractorConfiguration: 'extractor-configuration',\n  extractorImage: 'extractor-image',\n  extractorImageCollapsible: 'extractor-image-collapsible',\n  extractorInformation: 'extractor-information',\n  extractorPage: 'extractor-page',\n  extractorPageCollapsible: 'extractor-page-collapsible',\n  extractorPageFooter: 'extractor-page-footer',\n  extractorPageFooterCollapsible: 'extractor-page-footer-collapsible',\n  extractorPageHeader: 'extractor-page-header',\n  extractorPageHeaderCollapsible: 'extractor-page-header-collapsible',\n  extractorPageNumber: 'extractor-page-number',\n  extractorPageNumberCollapsible: 'extractor-page-number-collapsible',\n  extractorPageWithBlocks: 'extractor-page-with-blocks',\n  extractorPageWithBlocksCollapsible: 'extractor-page-with-blocks-collapsible',\n  extractorReconcile: 'extractor-reconcile',\n  extractorRepeatedText: 'extractor-repeated-text',\n  extractorRule: 'extractor-rule',\n  extractorTheme: 'extractor-theme',\n  featured: 'featured',\n  feedback: 'feedback',\n  figure: 'figure',\n  flashcard: 'flashcard',\n  flashcard1: 'flashcard-1',\n  focusImage: 'focus-image',\n  footNote: 'foot-note',\n  formFreeText: 'form-free-text',\n  formula: 'formula',\n  formulaImage: 'formula-image',\n  gapText: 'gap-text',\n  gapTextInstructionGrouped: 'gap-text-instruction-grouped',\n  glossaryTerm: 'glossary-term',\n  groupBorn: 'group-born',\n  groupDied: 'group-died',\n  handInAudio: 'hand-in-audio',\n  handInContact: 'hand-in-contact',\n  handInDocument: 'hand-in-document',\n  handInFeedbackExpert: 'hand-in-feedback-expert',\n  handInFeedbackSelf: 'hand-in-feedback-self',\n  handInFile: 'hand-in-file',\n  handInFreeText: 'hand-in-free-text',\n  handInFreeTextExpert: 'hand-in-free-text-expert',\n  handInLocation: 'hand-in-location',\n  handInPhoto: 'hand-in-photo',\n  handInScan: 'hand-in-scan',\n  handInSubmit: 'hand-in-submit',\n  handInSystemMedia: 'hand-in-system-media',\n  handInVideo: 'hand-in-video',\n  handInVoice: 'hand-in-voice',\n  help: 'help',\n  helpAlt: 'help-alt',\n  highlightText: 'highlight-text',\n  hint: 'hint',\n  hintAlt: 'hint-alt',\n  hintCollapsible: 'hint-collapsible',\n  image: 'image',\n  imageBanner: 'image-banner',\n  imageFigure: 'image-figure',\n  imageFigureAlt: 'image-figure-alt',\n  imageLandscape: 'image-landscape',\n  imageLink: 'image-link',\n  imageMood: 'image-mood',\n  imageOnDevice: 'image-on-device',\n  imagePortrait: 'image-portrait',\n  imagePrototype: 'image-prototype',\n  imageResponsive: 'image-responsive',\n  imageScreenshot: 'image-screenshot',\n  imageSeparator: 'image-separator',\n  imageSeparatorAlt: 'image-separator-alt',\n  imagesLogoGrave: 'images-logo-grave',\n  imageStyled: 'image-styled',\n  imageSuperWide: 'image-super-wide',\n  imageZoom: 'image-zoom',\n  indexTerm: 'index-term',\n  info: 'info',\n  infoAlt: 'info-alt',\n  infoCollapsible: 'info-collapsible',\n  internalLink: 'internal-link',\n  interview: 'interview',\n  interviewInstructionGrouped: 'interview-instruction-grouped',\n  langAudioScript: 'lang-audio-script',\n  langEnablingLanguageSkills: 'lang-enabling-language-skills',\n  langEnglishAroundWorld: 'lang-english-around-world',\n  langExtraActivity: 'lang-extra-activity',\n  langGoodToKnow: 'lang-good-to-know',\n  langHomework: 'lang-homework',\n  langLearningGoal: 'lang-learning-goal',\n  langLearningOutcomes: 'lang-learning-outcomes',\n  langLearningStrategy: 'lang-learning-strategy',\n  langLevelDown: 'lang-level-down',\n  langLevelUp: 'lang-level-up',\n  langLifeSkillIcon: 'lang-life-skill-icon',\n  langLifeSkills: 'lang-life-skills',\n  langLikeALocal: 'lang-like-a-local',\n  langMaterial: 'lang-material',\n  langTeacherNote: 'lang-teacher-note',\n  langTeacherPronunciation: 'lang-teacher-pronunciation',\n  langUsefulPhrases: 'lang-useful-phrases',\n  langVideoScript: 'lang-video-script',\n  langVocabulary: 'lang-vocabulary',\n  learningDocumentationFeedback: 'learning-documentation-feedback',\n  learningPathBook: 'learning-path-book',\n  learningPathBotTraining: 'learning-path-bot-training',\n  learningPathClassroomEvent: 'learning-path-classroom-event',\n  learningPathClassroomTraining: 'learning-path-classroom-training',\n  learningPathClosing: 'learning-path-closing',\n  learningPathExternalLink: 'learning-path-external-link',\n  learningPathFeedback: 'learning-path-feedback',\n  learningPathLearningGoal: 'learning-path-learning-goal',\n  learningPathLti: 'learning-path-lti',\n  learningPathSign: 'learning-path-sign',\n  learningPathStep: 'learning-path-step',\n  learningPathVideoCall: 'learning-path-video-call',\n  leAssignment: 'le-assignment',\n  leClassroomEvent: 'le-classroom-event',\n  leCompletion: 'le-completion',\n  leExternalLink: 'le-external-link',\n  leFinishingTask: 'le-finishing-task',\n  leFollowUpTask: 'le-follow-up-task',\n  leMultiDayEvent: 'le-multi-day-event',\n  legend: 'legend',\n  leDocumentDownload: 'le-document-download',\n  leLearningObjectives: 'le-learning-objectives',\n  leLearningStep: 'le-learning-step',\n  leListenAudioEmbed: 'le-listen-audio-embed',\n  lePreparationTask: 'le-preparation-task',\n  leRead: 'le-read',\n  leReadBook: 'le-read-book',\n  leTask: 'le-task',\n  leTodo: 'le-todo',\n  leVideoCall: 'le-video-call',\n  leWatchVideoEmbed: 'le-watch-video-embed',\n  lifeSkillSticker: 'life-skill-sticker',\n  list: 'list',\n  listItem: 'list-item',\n  mark: 'mark',\n  match: 'match',\n  matchAll: 'match-all',\n  matchAllReverse: 'match-all-reverse',\n  matchAudio: 'match-audio',\n  matchMatrix: 'match-matrix',\n  matchPicture: 'match-picture',\n  matchReverse: 'match-reverse',\n  matchSolutionGrouped: 'match-solution-grouped',\n  message: 'message',\n  metalevelExplanation: 'metalevel-explanation',\n  metaSearchDefaultTerms: 'meta-search-default-terms',\n  metaSearchDefaultTopics: 'meta-search-default-topics',\n  milestone: 'milestone',\n  module: 'module',\n  moduleProduct: 'module-product',\n  multipleChoice: 'multiple-choice',\n  multipleChoice1: 'multiple-choice-1',\n  multipleChoiceText: 'multiple-choice-text',\n  multipleResponse: 'multiple-response',\n  multipleResponse1: 'multiple-response-1',\n  newspaperArticle: 'newspaper-article',\n  nonProductionPrototypeIframe: 'non-production-prototype-iframe',\n  note: 'note',\n  noteAi: 'note-ai',\n  noteAlt: 'note-alt',\n  notebookArticle: 'notebook-article',\n  noteCollapsible: 'note-collapsible',\n  output: 'output',\n  page: 'page',\n  pageAcademy: 'page-academy',\n  pageArticle: 'page-article',\n  pageArticleAlt: 'page-article-alt',\n  pageArticleResponsive: 'page-article-responsive',\n  pageBanner: 'page-banner',\n  pageBuyButton: 'page-buy-button',\n  pageBuyButtonAlt: 'page-buy-button-alt',\n  pageBuyButtonPromotion: 'page-buy-button-promotion',\n  pageCategory: 'page-category',\n  pageCollapsible: 'page-collapsible',\n  pageContainer: 'page-container',\n  pageContainerFolder: 'page-container-folder',\n  pageContainerGroup: 'page-container-group',\n  pageContainerNowrap: 'page-container-nowrap',\n  pageContainerNowrapStretch: 'page-container-nowrap-stretch',\n  pageContainerWrap: 'page-container-wrap',\n  pageCoverImage: 'page-cover-image',\n  pageFooter: 'page-footer',\n  pageHero: 'page-hero',\n  pageOpenBook: 'page-open-book',\n  pageOpenBookList: 'page-open-book-list',\n  printBook: 'print-book',\n  openBookChapter: 'open-book-chapter',\n  openBookChapterTeaser: 'open-book-chapter-teaser',\n  pagePerson: 'page-person',\n  pageProduct: 'page-product',\n  pageProductList: 'page-product-list',\n  pageProductVideo: 'page-product-video',\n  pageProductVideoList: 'page-product-video-list',\n  pagePromotion: 'page-promotion',\n  pageSectionFolder: 'page-section-folder',\n  pageShopInShop: 'page-shop-in-shop',\n  pageSpecial: 'page-special',\n  pageEnd: 'page-end',\n  pageStart: 'page-start',\n  pageSubpage: 'page-subpage',\n  pageSubscribe: 'page-subscribe',\n  parameters: 'parameters',\n  photo: 'photo',\n  platform: 'platform',\n  platformBrandTarget: 'platform-brand-target',\n  platformHeader: 'platform-header',\n  platformMain: 'platform-main',\n  platformMainButton: 'platform-main-button',\n  platformMainInput: 'platform-main-input',\n  platformPath: 'platform-path',\n  platformSection: 'platform-section',\n  platformSectionButton: 'platform-section-button',\n  platformSectionChat: 'platform-section-chat',\n  platformSectionHeader: 'platform-section-header',\n  platformSectionInput: 'platform-section-input',\n  platformSystemIcon: 'platform-system-icon',\n  preparationNote: 'preparation-note',\n  printThisBook: 'print-this-book',\n  printThisChapter: 'print-this-chapter',\n  printPageBreak: 'print-page-break',\n  pronunciationTable: 'pronunciation-table',\n  prototypeImages: 'prototype-images',\n  qAndA: 'q-and-a',\n  qAndACard: 'q-and-a-card',\n  question1: 'question-1',\n  quote: 'quote',\n  rating: 'rating',\n  recipe: 'recipe',\n  recordAudio: 'record-audio',\n  recordVideo: 'record-video',\n  releaseNote: 'release-note',\n  releaseNotesSummary: 'release-notes-summary',\n  remark: 'remark',\n  remarkAlt: 'remark-alt',\n  remarkCollapsible: 'remark-collapsible',\n  reviewApprovedNote: 'review-approved-note',\n  reviewAuthorNote: 'review-author-note',\n  reviewCustomerNote: 'review-customer-note',\n  reviewError: 'review-error',\n  reviewErrorAi: 'review-error-ai',\n  reviewErrorTranslation: 'review-error-translation',\n  reviewNote: 'review-note',\n  reviewRequestForReviewNote: 'review-request-for-review-note',\n  reviewReviewerNote: 'review-reviewer-note',\n  sampleSolution: 'sample-solution',\n  sandbox: 'sandbox',\n  sandboxOutputJson: 'sandbox-output-json',\n  sandboxOutputMarkup: 'sandbox-output-markup',\n  sandboxOutputRender: 'sandbox-output-render',\n  scorm: 'scorm',\n  screenshot: 'screenshot',\n  selfAssessment: 'self-assessment',\n  separator: 'separator',\n  separatorAlt: 'separator-alt',\n  sequence: 'sequence',\n  sideNote: 'side-note',\n  sideNoteCollapsible: 'side-note-collapsible',\n  smartStandardArticleNonNormative: 'smart-standard-article-non-normative',\n  smartStandardArticleNonNormativeCollapsible: 'smart-standard-article-non-normative-collapsible',\n  smartStandardArticleNormative: 'smart-standard-article-normative',\n  smartStandardArticleNormativeCollapsible: 'smart-standard-article-normative-collapsible',\n  smartStandardDefinitionListNonNormative: 'smart-standard-definition-list-non-normative',\n  smartStandardDefinitionListNormative: 'smart-standard-definition-list-normative',\n  smartStandardExampleNonNormative: 'smart-standard-example-non-normative',\n  smartStandardExampleNonNormativeCollapsible: 'smart-standard-example-non-normative-collapsible',\n  smartStandardExampleNormative: 'smart-standard-example-normative',\n  smartStandardExampleNormativeCollapsible: 'smart-standard-example-normative-collapsible',\n  smartStandardFormula: 'smart-standard-formula',\n  smartStandardFormulaNonNormative: 'smart-standard-formula-non-normative',\n  smartStandardFormulaNormative: 'smart-standard-formula-normative',\n  smartStandardImageFigureNonNormative: 'smart-standard-image-figure-non-normative',\n  smartStandardImageFigureNonNormativeCollapsible:\n    'smart-standard-image-figure-non-normative-collapsible',\n  smartStandardImageFigureNormative: 'smart-standard-image-figure-normative',\n  smartStandardImageFigureNormativeCollapsible: 'smart-standard-image-figure-normative-collapsible',\n  smartStandardLegend: 'smart-standard-legend',\n  smartStandardLegendNonNormative: 'smart-standard-legend-non-normative',\n  smartStandardLegendNormative: 'smart-standard-legend-normative',\n  smartStandardList: 'smart-standard-list',\n  smartStandardListCollapsible: 'smart-standard-list-collapsible',\n  smartStandardListItem: 'smart-standard-list-item',\n  smartStandardListItemCollapsible: 'smart-standard-list-item-collapsible',\n  smartStandardNoteNonNormative: 'smart-standard-note-non-normative',\n  smartStandardNoteNonNormativeCollapsible: 'smart-standard-note-non-normative-collapsible',\n  smartStandardNoteNormative: 'smart-standard-note-normative',\n  smartStandardNoteNormativeCollapsible: 'smart-standard-note-normative-collapsible',\n  smartStandardRemarkLegend: 'smart-standard-remark-legend',\n  smartStandardRemarkLegendNonNormative: 'smart-standard-remark-legend-non-normative',\n  smartStandardRemarkLegendNormative: 'smart-standard-remark-legend-normative',\n  smartStandardRemarkFormula: 'smart-standard-remark-formula',\n  smartStandardRemarkFormulaNonNormative: 'smart-standard-remark-formula-non-normative',\n  smartStandardRemarkFormulaNormative: 'smart-standard-remark-formula-normative',\n  smartStandardRemarkNonNormative: 'smart-standard-remark-non-normative',\n  smartStandardRemarkNonNormativeCollapsible: 'smart-standard-remark-non-normative-collapsible',\n  smartStandardRemarkNormative: 'smart-standard-remark-normative',\n  smartStandardRemarkNormativeCollapsible: 'smart-standard-remark-normative-collapsible',\n  smartStandardRemarkTableExtendedImageNonNormative:\n    'smart-standard-remark-table-extended-image-non-normative',\n  smartStandardRemarkTableExtendedImageNonNormativeCollapsible:\n    'smart-standard-remark-table-extended-image-non-normative-collapsible',\n  smartStandardRemarkTableExtendedImageNormative:\n    'smart-standard-remark-table-extended-image-normative',\n  smartStandardRemarkTableExtendedImageNormativeCollapsible:\n    'smart-standard-remark-table-extended-image-normative-collapsible',\n  smartStandardRemarkTableExtendedNonNormative:\n    'smart-standard-remark-table-extended-non-normative',\n  smartStandardRemarkTableExtendedNonNormativeCollapsible:\n    'smart-standard-remark-table-extended-non-normative-collapsible',\n  smartStandardRemarkTableExtendedNormative: 'smart-standard-remark-table-extended-normative',\n  smartStandardRemarkTableExtendedNormativeCollapsible:\n    'smart-standard-remark-table-extended-normative-collapsible',\n  smartStandardRemarkTableImageNonNormative: 'smart-standard-remark-table-image-non-normative',\n  smartStandardRemarkTableImageNonNormativeCollapsible:\n    'smart-standard-remark-table-image-non-normative-collapsible',\n  smartStandardRemarkTableImageNormative: 'smart-standard-remark-table-image-normative',\n  smartStandardRemarkTableImageNormativeCollapsible:\n    'smart-standard-remark-table-image-normative-collapsible',\n  smartStandardRemarkTableNonNormative: 'smart-standard-remark-table-non-normative',\n  smartStandardRemarkTableNonNormativeCollapsible:\n    'smart-standard-remark-table-non-normative-collapsible',\n  smartStandardRemarkTableNormative: 'smart-standard-remark-table-normative',\n  smartStandardRemarkTableNormativeCollapsible: 'smart-standard-remark-table-normative-collapsible',\n  smartStandardTableExtendedImageNonNormative: 'smart-standard-table-extended-image-non-normative',\n  smartStandardTableExtendedImageNonNormativeCollapsible:\n    'smart-standard-table-extended-image-non-normative-collapsible',\n  smartStandardTableExtendedImageNormative: 'smart-standard-table-extended-image-normative',\n  smartStandardTableExtendedImageNormativeCollapsible:\n    'smart-standard-table-extended-image-normative-collapsible',\n  smartStandardTableExtendedNonNormative: 'smart-standard-table-extended-non-normative',\n  smartStandardTableExtendedNonNormativeCollapsible:\n    'smart-standard-table-extended-non-normative-collapsible',\n  smartStandardTableExtendedNormative: 'smart-standard-table-extended-normative',\n  smartStandardTableExtendedNormativeCollapsible:\n    'smart-standard-table-extended-normative-collapsible',\n  smartStandardTableImageNonNormative: 'smart-standard-table-image-non-normative',\n  smartStandardTableImageNonNormativeCollapsible:\n    'smart-standard-table-image-non-normative-collapsible',\n  smartStandardTableImageNormative: 'smart-standard-table-image-normative',\n  smartStandardTableImageNormativeCollapsible: 'smart-standard-table-image-normative-collapsible',\n  smartStandardTableNonNormative: 'smart-standard-table-non-normative',\n  smartStandardTableNonNormativeCollapsible: 'smart-standard-table-non-normative-collapsible',\n  smartStandardTableNormative: 'smart-standard-table-normative',\n  smartStandardTableNormativeCollapsible: 'smart-standard-table-normative-collapsible',\n  standardArticleNonNormative: 'standard-article-non-normative',\n  standardArticleNormative: 'standard-article-normative',\n  standardDefinitionListNonNormative: 'standard-definition-list-non-normative',\n  standardDefinitionListNormative: 'standard-definition-list-normative',\n  standardExampleNonNormative: 'standard-example-non-normative',\n  standardExampleNormative: 'standard-example-normative',\n  standardImageFigureNonNormative: 'standard-image-figure-non-normative',\n  standardImageFigureNormative: 'standard-image-figure-normative',\n  standardList: 'standard-list',\n  standardListItem: 'standard-list-item',\n  standardNoteNonNormative: 'standard-note-non-normative',\n  standardNoteNormative: 'standard-note-normative',\n  standardRemarkNonNormative: 'standard-remark-non-normative',\n  standardRemarkNormative: 'standard-remark-normative',\n  standardRemarkTableExtendedImageNonNormative:\n    'standard-remark-table-extended-image-non-normative',\n  standardRemarkTableExtendedImageNormative: 'standard-remark-table-extended-image-normative',\n  standardRemarkTableExtendedNonNormative: 'standard-remark-table-extended-non-normative',\n  standardRemarkTableExtendedNormative: 'standard-remark-table-extended-normative',\n  standardRemarkTableImageNonNormative: 'standard-remark-table-image-non-normative',\n  standardRemarkTableImageNormative: 'standard-remark-table-image-normative',\n  standardRemarkTableNonNormative: 'standard-remark-table-non-normative',\n  standardRemarkTableNormative: 'standard-remark-table-normative',\n  standardTableExtendedImageNonNormative: 'standard-table-extended-image-non-normative',\n  standardTableExtendedImageNormative: 'standard-table-extended-image-normative',\n  standardTableExtendedNonNormative: 'standard-table-extended-non-normative',\n  standardTableExtendedNormative: 'standard-table-extended-normative',\n  standardTableImageNonNormative: 'standard-table-image-non-normative',\n  standardTableImageNormative: 'standard-table-image-normative',\n  standardTableNonNormative: 'standard-table-non-normative',\n  standardTableNormative: 'standard-table-normative',\n  statement: 'statement',\n  stdout: 'stdout',\n  step: 'step',\n  stepImageScreenshot: 'step-image-screenshot',\n  stepImageScreenshotWithPointer: 'step-image-screenshot-with-pointer',\n  sticker: 'sticker',\n  stickyNote: 'sticky-note',\n  stillImageFilm: 'still-image-film',\n  stillImageFilmEmbed: 'still-image-film-embed',\n  stillImageFilmLink: 'still-image-film-link',\n  summary: 'summary',\n  summaryAi: 'summary-ai',\n  survey: 'survey',\n  survey1: 'survey-1',\n  surveyAnonymous: 'survey-anonymous',\n  surveyAnonymous1: 'survey-anonymous-1',\n  surveyMatrix: 'survey-matrix',\n  surveyMatrixMe: 'survey-matrix-me',\n  surveyRating: 'survey-rating',\n  surveyRatingDisplay: 'survey-rating-display',\n  surveyRatingOnce: 'survey-rating-once',\n  table: 'table',\n  tableAlt: 'table-alt',\n  tableExtended: 'table-extended',\n  tableExtendedImage: 'table-extended-image',\n  tableImage: 'table-image',\n  tableImageAlt: 'table-image-alt',\n  takePicture: 'take-picture',\n  toc: 'toc',\n  tocChapter: 'toc-chapter',\n  tocInline: 'toc-inline',\n  tocResource: 'toc-resource',\n  tocContent: 'toc-content',\n  trueFalse: 'true-false',\n  trueFalse1: 'true-false-1',\n  vendorAmcharts5Chart: 'vendor-amcharts-5-chart',\n  vendorDatadogDashboard: 'vendor-datadog-dashboard',\n  vendorDatadogDashboardEmbed: 'vendor-datadog-dashboard-embed',\n  vendorFormbricksEmbed: 'vendor-formbricks-embed',\n  vendorFormbricksLink: 'vendor-formbricks-link',\n  vendorFormbricksEmbedAnonymous: 'vendor-formbricks-embed-anonymous',\n  vendorFormbricksLinkAnonymous: 'vendor-formbricks-link-anonymous',\n  vendorHighchartsChart: 'vendor-highcharts-chart',\n  vendorIframelyCard: 'vendor-iframely-card',\n  vendorIframelyEmbed: 'vendor-iframely-embed',\n  vendorIframelyPreview: 'vendor-iframely-preview',\n  vendorIframelyPreviewMini: 'vendor-iframely-preview-mini',\n  vendorJupyterCellCode: 'vendor-jupyter-cell-code',\n  vendorJupyterCellMarkdown: 'vendor-jupyter-cell-markdown',\n  vendorJupyterCellRaw: 'vendor-jupyter-cell-raw',\n  vendorJupyterIpynb: 'vendor-jupyter-ipynb',\n  vendorJupyterOutput: 'vendor-jupyter-output',\n  vendorLearndashEmbed: 'vendor-learndash-embed',\n  vendorPadletEmbed: 'vendor-padlet-embed',\n  vendorStripePricingTable: 'vendor-stripe-pricing-table',\n  vendorStripePricingTableExternal: 'vendor-stripe-pricing-table-external',\n  vendorStripePricingTablePrintOnRequest: 'vendor-stripe-pricing-table-print-on-request',\n  video: 'video',\n  videoEmbed: 'video-embed',\n  videoEmbedLandscape: 'video-embed-landscape',\n  videoEmbedPortrait: 'video-embed-portrait',\n  videoLandscape: 'video-landscape',\n  videoLink: 'video-link',\n  videoLinkLandscape: 'video-link-landscape',\n  videoLinkPortrait: 'video-link-portrait',\n  videoPortrait: 'video-portrait',\n  videoTranscript: 'video-transcript',\n  warning: 'warning',\n  warningAlt: 'warning-alt',\n  warningCollapsible: 'warning-collapsible',\n  websiteLink: 'website-link',\n  workbookArticle: 'workbook-article',\n} as const;\n\nexport type BitTypeType = EnumType<typeof BitType>;\n\nexport { BitType };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst Count = {\n  infinity: 'infinity',\n} as const;\n\nexport type CountType = EnumType<typeof Count> | number;\n\nexport { Count };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst ExampleType = {\n  none: 'none', // Example is not allowed\n  string: 'string', // Example is a string value\n  boolean: 'boolean', // Example is a boolean value\n} as const;\n\nexport type ExampleTypeType = EnumType<typeof ExampleType>;\n\nexport { ExampleType };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst tags = {\n  tag_title: '#',\n  tag_anchor: '▼',\n  tag_reference: '►',\n  tag_property: '@',\n  tag_item: '%',\n  tag_instruction: '!',\n  tag_hint: '?',\n  tag_true: '+',\n  tag_false: '-',\n  tag_sampleSolution: '$',\n  tag_gap: '_',\n  tag_mark: '=',\n  tag_resource: '&',\n} as const;\n\nconst Tag = tags;\n\nexport type TagType = EnumType<typeof Tag>;\n\nexport { Tag, tags };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst TagFormat = {\n  none: 'none', // The property does not have a value\n  plainText: 'plainText', // If the value of the property is treated as a trimmed plain text string\n  bitmarkText: 'bitmarkText', // If the value of the property is treated as a bitmark+\n  number: 'number', // If the value is treated as a number\n  boolean: 'boolean', // If the value is treated as a boolean\n  invertedBoolean: 'invertedBoolean', // If the value is treated as a boolean with the value inverted (e.g. isLongAnswer ==> isShortAnswer = false)\n  enumeration: 'enumeration', // If the value is treated as an enumeration (the value is a string that must be one of a predefined set of values)\n  coordinates: 'coordinates', // Comma-separated list of 4 numbers (e.g. bounding-box x, y, x1, y1)\n} as const;\n\nexport type TagFormatType = EnumType<typeof TagFormat>;\n\nexport { TagFormat as TagFormat };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst TextFormat = {\n  // plain text\n  plainText: 'text',\n  latex: 'latex', // LaTeX code, alias for text\n  json: 'json', // json, alias for text\n  xml: 'xml', // xml, alias for text\n\n  // bitmarkText\n  // bitmarkText in the body is bitmark++ and bitmarkText in a tag is bitmark+\n  bitmarkText: 'bitmark++',\n} as const;\n\nexport type TextFormatType = EnumType<typeof TextFormat>;\n\nexport { TextFormat };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst CardSetConfigKey = {\n  flashcard: 'flashcard',\n  flashcard1: 'flashcard1',\n  definitionList: 'definitionList',\n  definitionListPlain: 'definitionListPlain',\n  elements: 'elements',\n  statements: 'statements',\n  quiz: 'quiz',\n  quizResponses: 'quizResponses',\n  feedback: 'feedback',\n  questions: 'questions',\n  matchPairs: 'matchPairs',\n  matchAudioPairs: 'matchAudioPairs',\n  matchImagePairs: 'matchImagePairs',\n  matchMatrix: 'matchMatrix',\n  table: 'table',\n  tableExtended: 'tableExtended',\n  pronunciationTable: 'pronunciationTable',\n  botActionResponses: 'botActionResponses',\n  exampleBitList: 'exampleBitList',\n  pageFooterSections: 'pageFooterSections',\n  clozeList: 'clozeList',\n  ingredients: 'ingredients',\n  // DEPRECATED - TO BE REMOVED IN THE FUTURE\n  // captionDefinitionsList: 'captionDefinitionsList',\n  bookReferenceList: 'bookReferenceList',\n} as const;\n\nexport type CardSetConfigKeyType = EnumType<typeof CardSetConfigKey>;\n\nexport { CardSetConfigKey };\n","import { type EnumType } from '@ncoderz/superenum';\n\n/**\n * Type of group config\n */\nconst GroupConfigType = {\n  standard: 'standard', // Any ordinary group\n  resource: 'resource', // A resource group\n  comboResource: 'comboResource', // A combo resource group\n} as const;\n\nexport type GroupConfigTypeType = EnumType<typeof GroupConfigType>;\n\nexport { GroupConfigType };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst BitTagConfigKeyType = {\n  unknown: 'unknown', // Unknown tag type, used for error handling\n\n  tag: 'tag', // A standard tag\n  property: 'property', // A property tag\n  resource: 'resource', // A resource tag\n\n  //\n  group: 'group', // A reusable group of tags\n} as const;\n\nexport type BitTagConfigKeyTypeType = EnumType<typeof BitTagConfigKeyType>;\n\nexport { BitTagConfigKeyType };\n","import { type BitTagConfigKeyTypeType } from '../enum/BitTagConfigKeyType.ts';\nimport { type CountType } from '../enum/Count.ts';\nimport { type ExportJsonKey, type HtmlKey } from './_Config.ts';\nimport type { ConfigKeyType } from './enum/ConfigKey.ts';\nimport { type TagsConfig } from './TagsConfig.ts';\n\nabstract class AbstractTagConfig {\n  readonly type: BitTagConfigKeyTypeType;\n  readonly configKey: ConfigKeyType;\n  readonly tag: string;\n  readonly maxCount: CountType; // Default: 1\n  readonly minCount: number; // Default: 0\n  readonly chain?: TagsConfig;\n\n  readonly jsonKey?: string; // Legacy string-form jsonKey\n  readonly exportJsonKey?: ExportJsonKey; // New JSON-pattern jsonKey (export-only)\n  readonly hasExportJsonKey: boolean; // True iff exportJsonKey was explicitly set\n\n  readonly htmlKey?: HtmlKey; // HTML key-pattern (export-only)\n  readonly hasHtmlKey: boolean; // True iff htmlKey was explicitly set\n\n  readonly deprecated?: string; // Deprecated version\n\n  public constructor(params: {\n    type: BitTagConfigKeyTypeType;\n    configKey: ConfigKeyType;\n    tag: string;\n    maxCount: CountType;\n    minCount: number;\n    chain: TagsConfig | undefined;\n    jsonKey: string | undefined;\n    exportJsonKey: ExportJsonKey | undefined;\n    hasExportJsonKey: boolean;\n    htmlKey: HtmlKey | undefined;\n    hasHtmlKey: boolean;\n    deprecated: string | undefined;\n  }) {\n    this.type = params.type;\n    this.configKey = params.configKey;\n    this.tag = params.tag;\n    this.maxCount = params.maxCount;\n    this.minCount = params.minCount;\n    this.chain = params.chain;\n    this.jsonKey = params.jsonKey;\n    this.exportJsonKey = params.exportJsonKey;\n    this.hasExportJsonKey = params.hasExportJsonKey;\n    this.htmlKey = params.htmlKey;\n    this.hasHtmlKey = params.hasHtmlKey;\n    this.deprecated = params.deprecated;\n  }\n}\n\nexport { AbstractTagConfig };\n","import { BitTagConfigKeyType, type BitTagConfigKeyTypeType } from '../enum/BitTagConfigKeyType.ts';\nimport { type CountType } from '../enum/Count.ts';\nimport { type TagType } from '../enum/Tag.ts';\nimport { type ExportJsonKey, type HtmlKey } from './_Config.ts';\nimport { AbstractTagConfig } from './AbstractTagConfig.ts';\nimport type { ConfigKeyType } from './enum/ConfigKey.ts';\nimport { type TagsConfig } from './TagsConfig.ts';\n\ninterface ToStringOptions {\n  includeChains?: boolean;\n  includeConfigs?: boolean;\n}\n\nclass MarkupTagConfig extends AbstractTagConfig {\n  readonly type: BitTagConfigKeyTypeType = BitTagConfigKeyType.tag;\n\n  public constructor(params: {\n    configKey: ConfigKeyType;\n    tag: TagType;\n    maxCount: CountType;\n    minCount: number;\n    chain: TagsConfig | undefined;\n    jsonKey: string | undefined;\n    exportJsonKey: ExportJsonKey | undefined;\n    hasExportJsonKey: boolean;\n    htmlKey: HtmlKey | undefined;\n    hasHtmlKey: boolean;\n    deprecated: string | undefined;\n  }) {\n    super({\n      type: BitTagConfigKeyType.tag,\n      ...params,\n    });\n  }\n\n  public toString(options?: ToStringOptions): string {\n    const opts = Object.assign({}, options);\n\n    let s = `TAG[${this.tag}`;\n    if (opts.includeConfigs) {\n      if (this.deprecated != null) s += `, deprecated=${this.deprecated}`;\n      if (this.maxCount != null) s += `, max=${this.maxCount}`;\n      if (this.minCount != null) s += `, min=${this.minCount}`;\n    }\n    s += ']';\n\n    if (this.chain && opts.includeChains) {\n      s += `\\n|__`;\n      let first = true;\n      for (const tag of Object.values(this.chain)) {\n        if (!first) s += ` `;\n        s += `${tag.toString(opts)}`;\n        first = false;\n      }\n    }\n\n    return s;\n  }\n}\n\nexport { MarkupTagConfig };\n","import { BitTagConfigKeyType, type BitTagConfigKeyTypeType } from '../enum/BitTagConfigKeyType.ts';\nimport { Count, type CountType } from '../enum/Count.ts';\nimport { type TagFormatType } from '../enum/TagFormat.ts';\nimport { type ExportJsonKey, type HtmlKey } from './_Config.ts';\nimport { AbstractTagConfig } from './AbstractTagConfig.ts';\nimport type { ConfigKeyType } from './enum/ConfigKey.ts';\nimport { type TagsConfig } from './TagsConfig.ts';\n\ninterface ToStringOptions {\n  includeChains?: boolean;\n  includeConfigs?: boolean;\n}\n\nclass PropertyTagConfig extends AbstractTagConfig {\n  readonly type: BitTagConfigKeyTypeType = BitTagConfigKeyType.property;\n\n  readonly array?: boolean; // If the property is treated as an array rather than a single value\n  readonly format?: TagFormatType; // How the property is formatted\n  readonly values?: string[]; // If the format is an enumeration, the possible values of the property\n  readonly defaultValue?: string; // The default value of the property - this value can be omitted from the markup\n\n  public constructor(params: {\n    configKey: ConfigKeyType;\n    tag: string;\n    maxCount: CountType;\n    minCount: number;\n    chain: TagsConfig | undefined;\n    jsonKey: string | undefined;\n    exportJsonKey: ExportJsonKey | undefined;\n    hasExportJsonKey: boolean;\n    htmlKey: HtmlKey | undefined;\n    hasHtmlKey: boolean;\n    format: TagFormatType | undefined;\n    values: string[] | undefined;\n    defaultValue: string | undefined;\n    deprecated: string | undefined;\n  }) {\n    super({\n      type: BitTagConfigKeyType.property,\n      ...params,\n    });\n\n    this.array = params.maxCount === Count.infinity || params.maxCount > 1;\n    this.format = params.format;\n    this.values = params.values;\n    this.defaultValue = params.defaultValue;\n  }\n\n  public toString(options?: ToStringOptions): string {\n    const opts = Object.assign({}, options);\n\n    let s = `PTY[${this.tag}`;\n    if (opts.includeConfigs) {\n      if (this.deprecated != null) s += `, deprecated=${this.deprecated}`;\n      if (this.maxCount != null) s += `, max=${this.maxCount}`;\n      if (this.minCount != null) s += `, min=${this.minCount}`;\n      if (this.array != null) s += `, arr=${this.array}`;\n      if (this.format != null) s += `, fmt=${this.format}`;\n      if (this.values != null) s += `, vals=[${this.values.join(',')}]`;\n      if (this.defaultValue != null) s += `, def=${this.defaultValue}`;\n      if (this.jsonKey != null) s += `, json=${this.jsonKey}`;\n    }\n    s += ']';\n\n    if (this.chain && opts.includeChains) {\n      s += `\\n|__`;\n      let first = true;\n      for (const tag of Object.values(this.chain)) {\n        if (!first) s += ` `;\n        s += `${tag.toString(opts)}`;\n        first = false;\n      }\n    }\n\n    return s;\n  }\n}\n\nexport { PropertyTagConfig };\n","import { BitTagConfigKeyType, type BitTagConfigKeyTypeType } from '../enum/BitTagConfigKeyType.ts';\nimport { type CountType } from '../enum/Count.ts';\nimport { type ExportJsonKey, type HtmlKey } from './_Config.ts';\nimport { AbstractTagConfig } from './AbstractTagConfig.ts';\nimport type { ConfigKeyType } from './enum/ConfigKey.ts';\nimport { type TagsConfig } from './TagsConfig.ts';\n\ninterface ToStringOptions {\n  includeChains?: boolean;\n  includeConfigs?: boolean;\n}\n\nclass ResourceTagConfig extends AbstractTagConfig {\n  readonly type: BitTagConfigKeyTypeType = BitTagConfigKeyType.resource;\n\n  public constructor(params: {\n    configKey: ConfigKeyType;\n    tag: string;\n    maxCount: CountType;\n    minCount: number;\n    chain: TagsConfig | undefined;\n    jsonKey: string | undefined;\n    exportJsonKey: ExportJsonKey | undefined;\n    hasExportJsonKey: boolean;\n    htmlKey: HtmlKey | undefined;\n    hasHtmlKey: boolean;\n    deprecated: string | undefined;\n  }) {\n    super({\n      type: BitTagConfigKeyType.resource,\n      ...params,\n    });\n\n    // TODO\n  }\n\n  public toString(options?: ToStringOptions): string {\n    const opts = Object.assign({}, options);\n\n    let s = `RES[${this.tag}`;\n    if (opts.includeConfigs) {\n      if (this.deprecated != null) s += `, deprecated=${this.deprecated}`;\n      if (this.maxCount != null) s += `, max=${this.maxCount}`;\n      if (this.minCount != null) s += `, min=${this.minCount}`;\n      if (this.jsonKey != null) s += `, json=${this.jsonKey}`;\n    }\n    s += ']';\n\n    if (this.chain && opts.includeChains) {\n      s += `\\n|__`;\n      let first = true;\n      for (const tag of Object.values(this.chain)) {\n        if (!first) s += ` `;\n        s += `${tag.toString(opts)}`;\n        first = false;\n      }\n    }\n\n    return s;\n  }\n}\n\nexport { ResourceTagConfig };\n","import { type CountType } from '../enum/Count.ts';\nimport { type TextFormatType } from '../enum/TextFormat.ts';\nimport { type ExportJsonKey, type HtmlKey } from './_Config.ts';\nimport { type TagsConfig } from './TagsConfig.ts';\n\ninterface ToStringOptions {\n  includeChains?: boolean;\n  includeConfigs?: boolean;\n}\n\nclass CardVariantConfig {\n  tags: TagsConfig;\n  bodyAllowed?: boolean; // Default: true\n  bodyRequired?: boolean; // Default: false\n  repeatCount?: CountType; // Default: 1\n  // JSON mapping fields\n  readonly jsonKey?: string | null; // JSON path for body text (legacy)\n  readonly exportJsonKey?: ExportJsonKey; // New JSON-pattern jsonKey\n  readonly hasExportJsonKey: boolean;\n  readonly htmlKey?: HtmlKey; // HTML key-pattern\n  readonly hasHtmlKey: boolean;\n  readonly format?: TextFormatType; // Body text format. Default: bitmark++\n\n  public constructor(\n    tags: TagsConfig,\n    bodyAllowed?: boolean,\n    bodyRequired?: boolean,\n    repeatCount?: CountType,\n    jsonKey?: string | null,\n    exportJsonKey?: ExportJsonKey,\n    hasExportJsonKey: boolean = false,\n    format?: TextFormatType,\n    htmlKey?: HtmlKey,\n    hasHtmlKey: boolean = false,\n  ) {\n    this.tags = tags;\n    this.bodyAllowed = bodyAllowed == null ? true : bodyAllowed;\n    this.bodyRequired = bodyRequired;\n    this.repeatCount = repeatCount;\n    this.jsonKey = jsonKey;\n    this.exportJsonKey = exportJsonKey;\n    this.hasExportJsonKey = hasExportJsonKey;\n    this.htmlKey = htmlKey;\n    this.hasHtmlKey = hasHtmlKey;\n    this.format = format;\n  }\n\n  public toString(options?: ToStringOptions): string {\n    const opts = Object.assign({}, options);\n\n    let s = '';\n\n    // Flags\n    const flags: string[] = [];\n    if (this.bodyAllowed) flags.push('bodyAllowed');\n    if (this.bodyRequired) flags.push('bodyRequired');\n    if (this.repeatCount != null) flags.push(`repeatCount=${this.repeatCount}`);\n    s += `[Flags]\\n${flags.join(', ')}`;\n\n    // Tags\n    s += `\\n\\n[Tags]`;\n\n    for (const tag of Object.values(this.tags)) {\n      s += `\\n${tag.toString(opts)}`;\n    }\n\n    return s;\n  }\n}\n\nexport { CardVariantConfig };\n","import { type ExportJsonKey, type HtmlKey } from './_Config.ts';\nimport { CardVariantConfig } from './CardVariantConfig.ts';\n\ninterface ToStringOptions {\n  includeChains?: boolean;\n  includeConfigs?: boolean;\n}\n\nclass CardSideConfig {\n  readonly name: string;\n  readonly repeat: boolean;\n  readonly jsonKey: string | null | undefined;\n  readonly exportJsonKey?: ExportJsonKey;\n  readonly hasExportJsonKey: boolean;\n  readonly htmlKey?: HtmlKey;\n  readonly hasHtmlKey: boolean;\n  readonly variants: CardVariantConfig[];\n\n  public constructor(\n    name: string,\n    repeat: boolean,\n    variants: CardVariantConfig[],\n    jsonKey?: string | null,\n    exportJsonKey?: ExportJsonKey,\n    hasExportJsonKey: boolean = false,\n    htmlKey?: HtmlKey,\n    hasHtmlKey: boolean = false,\n  ) {\n    this.name = name;\n    this.repeat = repeat;\n    this.jsonKey = jsonKey;\n    this.exportJsonKey = exportJsonKey;\n    this.hasExportJsonKey = hasExportJsonKey;\n    this.htmlKey = htmlKey;\n    this.hasHtmlKey = hasHtmlKey;\n    this.variants = variants;\n  }\n\n  public toString(options?: ToStringOptions): string {\n    const opts = Object.assign({}, options);\n\n    let s = '';\n\n    s += `[Side: ${this.name}]`;\n    if (this.repeat) s += ' (repeat)';\n\n    let variantNo = 0;\n    for (const variant of this.variants) {\n      s += `\\n  [Variant ${variantNo}]`;\n      s += `\\n  ${variant.toString(opts)}`;\n      variantNo++;\n    }\n\n    return s;\n  }\n}\n\nexport { CardSideConfig };\n","import { type ExportJsonKey, type HtmlKey } from './_Config.ts';\nimport { type CardSideConfig } from './CardSideConfig.ts';\nimport { type CardVariantConfig } from './CardVariantConfig.ts';\nimport { type CardSetConfigKeyType } from './enum/CardSetConfigKey.ts';\n\ninterface ToStringOptions {\n  includeChains?: boolean;\n  includeConfigs?: boolean;\n}\n\ninterface CardSetSection {\n  jsonKey: string;\n  exportJsonKey?: ExportJsonKey;\n  hasExportJsonKey?: boolean;\n  htmlKey?: HtmlKey;\n  hasHtmlKey?: boolean;\n  isDefault?: boolean;\n  sideJsonKey?: string;\n  sideExportJsonKey?: ExportJsonKey;\n  hasSideExportJsonKey?: boolean;\n  sideHtmlKey?: HtmlKey;\n  hasSideHtmlKey?: boolean;\n  // PLAN-085: cardinality on the section (per-card-type). `0` (default)\n  // means unbounded. Exported as `min` / `max` in the per-card config\n  // JSON; mirrored on the Rust `CardConfig.min/max` field.\n  minCount?: number;\n  maxCount?: number;\n}\n\nclass CardSetConfig {\n  readonly configKey: CardSetConfigKeyType;\n  readonly jsonKey: string | null;\n  readonly exportJsonKey?: ExportJsonKey;\n  readonly hasExportJsonKey: boolean;\n  readonly htmlKey?: HtmlKey;\n  readonly hasHtmlKey: boolean;\n  readonly sections: Record<string, CardSetSection> | undefined;\n  readonly sides: CardSideConfig[];\n\n  // Legacy accessor — provides the same shape as the old `variants: CardVariantConfig[][]`\n  // so downstream consumers (Config.getCardSetVariantConfig, etc.) continue to work.\n  get variants(): CardVariantConfig[][] {\n    return this.sides.map((side) => side.variants);\n  }\n\n  public constructor(\n    configKey: CardSetConfigKeyType,\n    jsonKey: string | null,\n    exportJsonKey: ExportJsonKey | undefined,\n    hasExportJsonKey: boolean,\n    sections: Record<string, CardSetSection> | undefined,\n    sides: CardSideConfig[],\n    htmlKey: HtmlKey | undefined = undefined,\n    hasHtmlKey: boolean = false,\n  ) {\n    this.configKey = configKey;\n    this.jsonKey = jsonKey;\n    this.exportJsonKey = exportJsonKey;\n    this.hasExportJsonKey = hasExportJsonKey;\n    this.htmlKey = htmlKey;\n    this.hasHtmlKey = hasHtmlKey;\n    this.sections = sections;\n    this.sides = sides;\n  }\n\n  public toString(options?: ToStringOptions): string {\n    const opts = Object.assign({}, options);\n\n    let s = '';\n\n    s += `[CardSet: ${this.configKey}]`;\n    s += `\\n  jsonKey: ${this.jsonKey}`;\n\n    for (const side of this.sides) {\n      s += `\\n${side.toString(opts)}`;\n    }\n\n    return s;\n  }\n}\n\nexport { CardSetConfig, type CardSetSection };\n","import { type BitTypeType } from '../enum/BitType.ts';\nimport { Count } from '../enum/Count.ts';\nimport { type ExampleTypeType } from '../enum/ExampleType.ts';\nimport { type TextFormatType } from '../enum/TextFormat.ts';\nimport { CardSetConfig } from './CardSetConfig.ts';\nimport type { ConfigKeyType } from './enum/ConfigKey.ts';\nimport { type TagsConfig } from './TagsConfig.ts';\n\ninterface ToStringOptions {\n  includeChains?: boolean;\n  includeConfigs?: boolean;\n}\n\nclass BitConfig {\n  readonly since: string; // Supported since version\n  readonly bitType: BitTypeType;\n  readonly inheritedBitTypes: BitTypeType[]; // Bit inheritance tree (array for order)\n  readonly inheritedBitTypesSet: Set<BitTypeType>; // Bit inheritance tree (set for faster lookup)\n  readonly textFormatDefault: TextFormatType; // Default text format\n  readonly tags: TagsConfig = {};\n  readonly cardSet?: CardSetConfig;\n  readonly quizBit?: boolean; // True if the bit is a quiz bit\n  readonly deprecated?: string; // Deprecated version\n  readonly bodyAllowed?: boolean; // Default: true\n  readonly bodyRequired?: boolean; // Default: false\n  readonly footerAllowed?: boolean; // Default: true\n  readonly footerRequired?: boolean; // Default: false\n  readonly resourceAttachmentAllowed?: boolean; // Default: true\n  readonly rootExampleType?: ExampleTypeType;\n  readonly comboResourceConfigKey?: ConfigKeyType;\n\n  public constructor(config: {\n    since: string;\n    bitType: BitTypeType;\n    inheritedBitTypes: BitTypeType[];\n    textFormatDefault: TextFormatType;\n    tags: TagsConfig;\n    cardSet: CardSetConfig | undefined;\n    quizBit: boolean | undefined;\n    deprecated: string | undefined;\n    bodyAllowed: boolean | undefined;\n    bodyRequired: boolean | undefined;\n    footerAllowed: boolean | undefined;\n    footerRequired: boolean | undefined;\n    resourceAttachmentAllowed: boolean | undefined;\n    rootExampleType: ExampleTypeType | undefined;\n    comboResourceConfigKey: ConfigKeyType | undefined;\n  }) {\n    const {\n      since,\n      bitType,\n      inheritedBitTypes,\n      textFormatDefault,\n      tags,\n      cardSet,\n      quizBit,\n      deprecated,\n      bodyAllowed,\n      bodyRequired,\n      footerAllowed,\n      footerRequired,\n      resourceAttachmentAllowed,\n      rootExampleType,\n      comboResourceConfigKey,\n    } = config;\n    this.since = since;\n    this.bitType = bitType;\n    this.inheritedBitTypes = inheritedBitTypes;\n    this.inheritedBitTypesSet = new Set(inheritedBitTypes);\n    this.textFormatDefault = textFormatDefault;\n    this.tags = tags;\n    this.cardSet = cardSet;\n    this.quizBit = quizBit;\n    this.deprecated = deprecated;\n    this.bodyAllowed = bodyAllowed == null ? true : bodyAllowed;\n    this.bodyRequired = bodyRequired;\n    this.footerAllowed = footerAllowed == null ? true : footerAllowed;\n    this.footerRequired = footerRequired;\n    this.resourceAttachmentAllowed =\n      resourceAttachmentAllowed == null ? true : resourceAttachmentAllowed;\n    this.rootExampleType = rootExampleType;\n    this.comboResourceConfigKey = comboResourceConfigKey;\n  }\n\n  public toString(options?: ToStringOptions): string {\n    const opts = Object.assign({}, options);\n\n    let s = `[Bit]\\n${this.bitType}`;\n\n    // Aliases\n    if (this.inheritedBitTypes.length > 0) {\n      s += `\\n\\n[Inheritance]`;\n\n      s += `\\n${this.inheritedBitTypes.join(' => ')}`;\n    }\n\n    // Default text format\n    s += `\\n\\n[Default text format]\\n${this.textFormatDefault}`;\n\n    // Flags\n    const flags: string[] = [];\n    if (this.since != null) flags.push(`since=${this.since}`);\n    if (this.deprecated != null) flags.push(`deprecated=${this.deprecated}`);\n    if (this.bodyAllowed) flags.push('bodyAllowed');\n    if (this.bodyRequired) flags.push('bodyRequired');\n    if (this.footerAllowed) flags.push('footerAllowed');\n    if (this.footerRequired) flags.push('footerRequired');\n    if (this.resourceAttachmentAllowed) flags.push('resourceAttachmentAllowed');\n    if (this.rootExampleType != null) flags.push(`rootExampleType=${this.rootExampleType}`);\n    if (this.comboResourceConfigKey != null)\n      flags.push(`comboResourceConfigKey=${this.comboResourceConfigKey}`);\n    s += `\\n\\n[Flags]\\n${flags.join(', ')}`;\n\n    // Tags\n    s += `\\n\\n[Tags]`;\n\n    for (const tag of Object.values(this.tags)) {\n      if (tag.maxCount === Count.infinity || tag.maxCount > 0) {\n        s += `\\n${tag.toString(opts)}`;\n      }\n    }\n\n    // Cards\n    if (this.cardSet) {\n      s += `\\n\\n${this.cardSet.toString(opts)}`;\n    }\n\n    return s;\n  }\n}\n\nexport { BitConfig };\n","import { Enum, type EnumType } from '@ncoderz/superenum';\n\nimport {\n  BitTagConfigKeyType,\n  type BitTagConfigKeyTypeType,\n} from '../../enum/BitTagConfigKeyType.ts';\nimport { groupKeys } from '../../enum/GroupKey.ts';\nimport { propertyKeys } from '../../enum/PropertyKey.ts';\nimport { resourceKeys } from '../../enum/ResourceKey.ts';\nimport { ResourceType, type ResourceTypeType } from '../../enum/ResourceType.ts';\nimport { tags } from '../../enum/Tag.ts';\n\n/**\n * Config keys for tags, resources, properties, and groups.\n *\n * Each type has a different prefix so there are no conflicts:\n * - Resources: `&`\n * - Properties: `@`\n * - Groups: `group_`\n * - Tags: <none>\n *\n */\nconst ConfigKey = {\n  // Internal\n  _unknown: '_unknown',\n\n  // Tags\n  ...tags,\n\n  // Resources\n  ...resourceKeys,\n\n  // Properties\n  ...propertyKeys,\n\n  // Groups\n  ...groupKeys,\n} as const;\n\nexport type ConfigKeyType = EnumType<typeof ConfigKey>;\n\nfunction typeFromConfigKey(tagKey: ConfigKeyType): BitTagConfigKeyTypeType {\n  if (!tagKey) return BitTagConfigKeyType.unknown;\n\n  if (tagKey.startsWith('@')) return BitTagConfigKeyType.property;\n  if (tagKey.startsWith('&')) return BitTagConfigKeyType.resource;\n  if (tagKey.startsWith('group_')) return BitTagConfigKeyType.group;\n\n  return BitTagConfigKeyType.tag;\n}\n\nfunction configKeyToPropertyType(configKey: string): string {\n  return configKey.replace(/^@/, '');\n}\n\nfunction configKeyToResourceType(configKey: string): ResourceTypeType {\n  return Enum(ResourceType).fromKey(configKey.replace(/^&/, '')) as ResourceTypeType;\n}\n\nexport { ConfigKey, configKeyToPropertyType, configKeyToResourceType, typeFromConfigKey };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst groupKeys = {\n  group_standardAllBits: 'group_standardAllBits',\n  group_standardItemLead: 'group_standardItemLead',\n  group_standardItemLeadInstructionHint: 'group_standardItemLeadInstructionHint',\n  group_standardInstructionHint: 'group_standardInstructionHint',\n  group_standardTags: 'group_standardTags',\n  group_standardTagsNoItemLead: 'group_standardTagsNoItemLead',\n  group_imageSource: 'group_imageSource',\n  group_technicalTerm: 'group_technicalTerm',\n  group_person: 'group_person',\n  group_gap: 'group_gap',\n  group_trueFalse: 'group_trueFalse',\n  group_trueFalseInlineHighlight: 'group_trueFalseInlineHighlight',\n  group_trueFalseInlineSelect: 'group_trueFalseInlineSelect',\n  group_trueFalseResponses: 'group_trueFalseResponses',\n  group_markConfig: 'group_markConfig',\n  group_mark: 'group_mark',\n  group_bookCommon: 'group_bookCommon',\n  group_learningPathCommon: 'group_learningPathCommon',\n  group_advertisingCommon: 'group_advertisingCommon',\n  group_platformStylesCommon: 'group_platformStylesCommon',\n  group_quizCommon: 'group_quizCommon',\n  group_backgroundWallpaper: 'group_backgroundWallpaper',\n  group_imageNoZoom: 'group_imageNoZoom',\n  group_resourceBitTags: 'group_resourceBitTags',\n  group_resourceCommon: 'group_resourceCommon',\n  group_resourceImageCommon: 'group_resourceImageCommon',\n  group_resourceImageCommonNoZoom: 'group_resourceImageCommonNoZoom',\n  group_resourceAudioCommon: 'group_resourceAudioCommon',\n  group_resourceVideoCommon: 'group_resourceVideoCommon',\n  group_resourceIcon: 'group_resourceIcon', // Alias for image\n  group_resourceImage: 'group_resourceImage',\n  group_resourceImageNoZoom: 'group_resourceImageNoZoom',\n  group_resourceImageEmbed: 'group_resourceImageEmbed',\n  group_resourceImageLink: 'group_resourceImageLink',\n  group_resourceImageResponsive: 'group_resourceImageResponsive', // Combo resource\n  group_resourceImagePortrait: 'group_resourceImagePortrait',\n  group_resourceImageLandscape: 'group_resourceImageLandscape',\n  group_resourceAudio: 'group_resourceAudio',\n  group_resourceAudioEmbed: 'group_resourceAudioEmbed',\n  group_resourceAudioLink: 'group_resourceAudioLink',\n  group_resourceVideo: 'group_resourceVideo',\n  group_resourceVideoEmbed: 'group_resourceVideoEmbed',\n  group_resourceVideoLink: 'group_resourceVideoLink',\n  group_resourceStillImageFilm: 'group_resourceStillImageFilm', // Combo resource\n  group_resourceStillImageFilmEmbed: 'group_resourceStillImageFilmEmbed',\n  group_resourceStillImageFilmLink: 'group_resourceStillImageFilmLink',\n  group_resourceArticle: 'group_resourceArticle',\n  group_resourceArticleEmbed: 'group_resourceArticleEmbed',\n  group_resourceArticleLink: 'group_resourceArticleLink',\n  group_resourceDocument: 'group_resourceDocument',\n  group_resourceDocumentEmbed: 'group_resourceDocumentEmbed',\n  group_resourceDocumentLink: 'group_resourceDocumentLink',\n  group_resourceDocumentDownload: 'group_resourceDocumentDownload',\n  group_resourceAppLink: 'group_resourceAppLink',\n  group_resourceWebsiteLink: 'group_resourceWebsiteLink',\n  group_previewImages: 'group_previewImages',\n  group_previewVideos: 'group_previewVideos',\n} as const;\n\nconst GroupKey = groupKeys;\n\nexport type GroupKeyType = EnumType<typeof GroupKey>;\n\nexport { GroupKey, groupKeys };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst propertyKeys = {\n  property_action: '@action',\n  property_activityType: '@activityType',\n  property_additionalSolutions: '@additionalSolutions',\n  property_advertisingClickUrl: '@advertisingClickUrl',\n  property_ageRange: '@ageRange',\n  property_aiGenerated: '@aiGenerated',\n  property_allowedBit: '@allowedBit',\n  property_allowPrint: '@allowPrint',\n  property_allowSubtitles: '@allowSubtitles',\n  property_alt: '@alt',\n  property_altLangTag: '@altLangTag',\n  property_analyticsTag: '@analyticsTag',\n  property_author: '@author',\n  property_authorFullName: '@authorFullName',\n  property_authorJobTitle: '@authorJobTitle',\n  property_authorPseudonym: '@authorPseudonym',\n  property_authorTitle: '@authorTitle',\n  property_autoplay: '@autoplay',\n  property_availableClassifications: '@availableClassifications',\n  property_brandColor: '@brandColor',\n  property_brandColorName: '@brandColorName',\n  property_backgroundImage: '@backgroundImage',\n  property_blockId: '@blockId',\n  property_book: '@book',\n  property_bookAlias: '@bookAlias',\n  property_bookDiff: '@bookDiff',\n  property_bot: '@bot',\n  property_bubbleTag: '@bubbleTag',\n  property_extractorTag: '@extractorTag',\n  property_extractorInternal: '@extractorInternal',\n  property_bitFingerprint: '@bitFingerprint',\n  property_buttonCaption: '@buttonCaption',\n  property_callToActionUrl: '@callToActionUrl',\n  property_caption: '@caption',\n  property_categoryTag: '@categoryTag',\n  property_chatWithBook: '@chatWithBook',\n  property_chatWithBookBrainKey: '@chatWithBookBrainKey',\n  property_currency: '@currency',\n  property_bookIsbn: '@bookIsbn',\n  property_bookAuthor: '@bookAuthor',\n  property_bookType: '@bookType',\n  property_bookBindingType: '@bookBindingType',\n  property_bookNumberOfPages: '@bookNumberOfPages',\n  property_bookRating: '@bookRating',\n  property_bookSeriesTitle: '@bookSeriesTitle',\n  property_bookSeriesId: '@bookSeriesId',\n  property_bookSeriesNumber: '@bookSeriesNumber',\n  property_bookLanguage: '@bookLanguage',\n  property_bookPublishingDate: '@bookPublishingDate',\n  property_bookPublisher: '@bookPublisher',\n  property_bookTranslator: '@bookTranslator',\n  property_bookOriginalTitle: '@bookOriginalTitle',\n  property_gmbExternalShop: '@gmbExternalShop',\n  property_gmbExternalShopItems: '@gmbExternalShopItems',\n  property_citationStyle: '@citationStyle',\n  property_classification: '@classification',\n  property_codeLineNumbers: '@codeLineNumbers',\n  property_codeMinimap: '@codeMinimap',\n  property_color: '@color',\n  property_colorTag: '@colorTag',\n  property_computerLanguage: '@computerLanguage',\n  property_content2Buy: '@content2Buy',\n  property_listPrice: '@listPrice',\n  property_customerProductId: '@customerProductId',\n  property_customerProductShopLink: '@customerProductShopLink',\n  property_copyright: '@copyright',\n  property_coverColor: '@coverColor',\n  property_coverImage: '@coverImage',\n  property_customerExternalId: '@customerExternalId',\n  property_customerId: '@customerId',\n  property_date: '@date',\n  property_dateEnd: '@dateEnd',\n  property_decimalPlaces: '@decimalPlaces',\n  property_deeplink: '@deeplink',\n  property_displayName: '@displayName',\n  property_diffContext: '@diffContext',\n  property_diffOp: '@diffOp',\n  property_diffRef: '@diffRef',\n  property_diffTime: '@diffTime',\n  property_diffTo: '@diffTo',\n  property_disableCalculation: '@disableCalculation',\n  property_disableFeedback: '@disableFeedback',\n  property_duration: '@duration',\n  property_isEditable: '@isEditable',\n  property_needsValidation: '@needsValidation',\n  property_validationDate: '@validationDate',\n  property_emphasis: '@emphasis',\n  property_example: '@example',\n  property_externalId: '@externalId',\n  property_externalLink: '@externalLink',\n  property_externalLinkText: '@externalLinkText',\n  property_feedbackEngine: '@feedbackEngine',\n  property_feedbackType: '@feedbackType',\n  property_userFeedbackTranslationUrl: '@userFeedbackTranslationUrl',\n  property_userFeedbackContentUrl: '@userFeedbackContentUrl',\n  property_flashcardSet: '@flashcardSet',\n  property_focusX: '@focusX',\n  property_focusY: '@focusY',\n  property_format: '@format',\n  property_formula: '@formula',\n  property_fullName: '@fullName',\n  property_groupTag: '@groupTag',\n  property_gUri: '@gUri',\n  property_handInAcceptFileType: '@handInAcceptFileType',\n  property_handInInstruction: '@handInInstruction',\n  property_handInRequirement: '@handInRequirement',\n  property_hasBookNavigation: '@hasBookNavigation',\n  property_hasMarkAsDone: '@hasMarkAsDone',\n  property_height: '@height',\n  property_icon: '@icon',\n  property_iconTag: '@iconTag',\n  property_id: '@id',\n  property_iframeSrc: '@iframeSrc',\n  property_iframeName: '@iframeName',\n  property_imageFirst: '@imageFirst',\n  property_imageSource: '@imageSource',\n  property_index: '@index',\n  property_internalComment: '@internalComment',\n  property_internalPrintPdf: '@internalPrintPdf',\n  property_hasPrintRestriction: '@hasPrintRestriction',\n  property_enforceUpdateOverUserInput: '@enforceUpdateOverUserInput',\n  property_extractorExtractionTimestamp: '@extractorExtractionTimestamp',\n  property_isCaseSensitive: '@isCaseSensitive',\n  property_isCollapsible: '@isCollapsible',\n  property_isInfoOnly: '@isInfoOnly',\n  property_isPublic: '@isPublic',\n  property_isTemplate: '@isTemplate',\n  property_isTemplateStripTheme: '@isTemplateStripTheme',\n  property_isTracked: '@isTracked',\n  property_jobTitle: '@jobTitle',\n  property_jupyterExecutionCount: '@jupyterExecutionCount',\n  property_jupyterId: '@jupyterId',\n  property_kind: '@kind',\n  property_label: '@label',\n  property_labelFalse: '@labelFalse',\n  property_labelTrue: '@labelTrue',\n  property_lang: '@lang',\n  property_language: '@language',\n  property_layer: '@layer',\n  property_layerRole: '@layerRole',\n  property_levelACTFL: '@levelACTFL',\n  property_levelCEFR: '@levelCEFR',\n  property_levelCEFRp: '@levelCEFRp',\n  property_levelILR: '@levelILR',\n  property_license: '@license',\n  property_list: '@list',\n  property_listItemIndent: '@listItemIndent',\n  property_location: '@location',\n  property_machineTranslated: '@machineTranslated',\n  property_translationOf: '@translationOf',\n  property_translationOfBook: '@translationOfBook',\n  property_spansPageBreak: '@spansPageBreak',\n  property_mailingList: '@mailingList',\n  property_mark: '@mark',\n  property_maxCreatedBits: '@maxCreatedBits',\n  property_maxDisplayLevel: '@maxDisplayLevel',\n  property_maxTocChapterLevel: '@maxTocChapterLevel',\n  property_mockupId: '@mockupId',\n  property_mute: '@mute',\n  property_padletId: '@padletId',\n  property_page: '@page',\n  property_printParentChapterLevel: '@printParentChapterLevel',\n  property_printOnRequestCustomerId: '@printOnRequestCustomerId',\n  property_printOnRequestProductId: '@printOnRequestProductId',\n  property_pageNo: '@pageNo',\n  property_partialAnswer: '@partialAnswer',\n  property_partner: '@partner', // Deprecated, replaced by person\n  property_path: '@path',\n  property_platformBackgroundColor: '@platformBackgroundColor',\n  property_platformBorderColor: '@platformBorderColor',\n  property_platformBrandTarget: '@platformBrandTarget',\n  property_platformButtonBackgroundColor: '@platformButtonBackgroundColor',\n  property_platformButtonPrimaryColor: '@platformButtonPrimaryColor',\n  property_platformMessageBackgroundColor: '@platformMessageBackgroundColor',\n  property_platformName: '@platformName',\n  property_platformPlaceholderColor: '@platformPlaceholderColor',\n  property_platformPrimaryColor: '@platformPrimaryColor',\n  property_platformScrollbarColor: '@platformScrollbarColor',\n  property_platformSecondaryColor: '@platformSecondaryColor',\n  property_platformSelectionColor: '@platformSelectionColor',\n  property_platformSelectionTextColor: '@platformSelectionTextColor',\n  property_platformBaseLayerColor: '@platformBaseLayerColor',\n  property_platformMargin: '@platformMargin',\n  property_platformBorderRadius: '@platformBorderRadius',\n  property_platformSelectionBorderRadius: '@platformSelectionBorderRadius',\n  property_platformLogoMaxHeight: '@platformLogoMaxHeight',\n  property_platformNeedsShadow: '@platformNeedsShadow',\n  property_platformSeparatorColor: '@platformSeparatorColor',\n  property_platformTextSelectionColor: '@platformTextSelectionColor',\n  property_person: '@person',\n  property_pointerLeft: '@pointerLeft',\n  property_pointerTop: '@pointerTop',\n  property_posterImage: '@posterImage',\n  property_processHandIn: '@processHandIn',\n  property_processHandInLocation: '@processHandInLocation',\n  property_product: '@product',\n  property_productFolder: '@productFolder',\n  property_productId: '@productId',\n  property_productVideo: '@productVideo',\n  property_progress: '@progress',\n  property_pseudonym: '@pseudonym',\n  property_publications: '@publications',\n  property_publisher: '@publisher',\n  property_publisherName: '@publisherName',\n  property_quizCountItems: '@quizCountItems',\n  property_quizStrikethroughSolutions: '@quizStrikethroughSolutions',\n  property_quotedPerson: '@quotedPerson',\n  property_ratingLevelEnd: '@ratingLevelEnd',\n  property_ratingLevelSelected: '@ratingLevelSelected',\n  property_ratingLevelStart: '@ratingLevelStart',\n  property_reaction: '@reaction',\n  property_reasonableNumOfChars: '@reasonableNumOfChars',\n  property_reductionTag: '@reductionTag',\n  property_refAuthor: '@refAuthor',\n  property_refBookTitle: '@refBookTitle',\n  property_reference: '@reference',\n  property_refPublicationYear: '@refPublicationYear',\n  property_refPublisher: '@refPublisher',\n  property_relatedBook: '@relatedBook',\n  property_releaseDate: '@releaseDate',\n  property_releaseKind: '@releaseKind',\n  property_releaseVersion: '@releaseVersion',\n  property_reportTag: '@reportTag',\n  property_resolved: '@resolved',\n  property_resolvedBy: '@resolvedBy',\n  property_resolvedDate: '@resolvedDate',\n  property_revealSolutions: '@revealSolutions',\n  property_reviewTag: '@reviewTag',\n  property_reviewerTag: '@reviewerTag',\n  property_rightsPolicy: '@rightsPolicy',\n  property_sampleSolution: '@sampleSolution',\n  property_scormSource: '@scormSource',\n  property_search: '@search',\n  property_searchIndex: '@searchIndex',\n  property_selected: '@selected',\n  property_servings: '@servings',\n  property_showInIndex: '@showInIndex',\n  property_showSubtitles: '@showSubtitles',\n  property_siteName: '@siteName',\n  property_size: '@size',\n  property_slug: '@slug',\n  property_sourceBB: '@sourceBB',\n  property_sourceDocument: '@sourceDocument',\n  property_sourceRL: '@sourceRL',\n  property_spaceId: '@spaceId',\n  property_src1x: '@src1x',\n  property_src2x: '@src2x',\n  property_src3x: '@src3x',\n  property_src4x: '@src4x',\n  property_srcAlt: '@srcAlt',\n  property_stripePricingTableId: '@stripePricingTableId',\n  property_stripePricingTableDescriptiveName: '@stripePricingTableDescriptiveName',\n  property_stripePublishableKey: '@stripePublishableKey',\n  property_subject: '@subject',\n  property_subtype: '@subtype',\n  property_tableAutoWidth: '@tableAutoWidth',\n  property_tableColWidth: '@tableColWidth',\n  property_tableColumnMinWidth: '@tableColumnMinWidth',\n  property_tableFixedHeader: '@tableFixedHeader',\n  property_tableHeaderWhitespaceNoWrap: '@tableHeaderWhitespaceNoWrap',\n  property_tableHeight: '@tableHeight',\n  property_tablePagination: '@tablePagination',\n  property_tablePaginationLimit: '@tablePaginationLimit',\n  property_tableResizableColumns: '@tableResizableColumns',\n  property_tableSearch: '@tableSearch',\n  property_tableSort: '@tableSort',\n  property_tableWhitespaceNoWrap: '@tableWhitespaceNoWrap',\n  property_tableCellType: '@tableCellType',\n  property_tableRowSpan: '@tableRowSpan',\n  property_tableColSpan: '@tableColSpan',\n  property_tableScope: '@tableScope',\n  property_tag: '@tag',\n  property_target: '@target',\n  property_technicalTerm: '@technicalTerm',\n  property_textReference: '@textReference',\n  property_theme: '@theme',\n  property_rtl: '@rtl',\n  property_thumbImage: '@thumbImage',\n  property_title: '@title',\n  property_toc: '@toc',\n  property_tocContent: '@tocContent',\n  property_tocResource: '@tocResource',\n  property_topicTag: '@topicTag',\n  property_trim: '@trim',\n  property_unit: '@unit',\n  property_unitAbbr: '@unitAbbr',\n  property_unitAbbrPlural: '@unitAbbrPlural',\n  property_unitPlural: '@unitPlural',\n  property_vendorDashboardId: '@vendorDashboardId',\n  property_vendorSurveyId: '@vendorSurveyId',\n  property_vendorUrl: '@vendorUrl',\n  property_videoCallLink: '@videoCallLink',\n  property_width: '@width',\n  property_x: '@x',\n  property_y: '@y',\n  property_zoomDisabled: '@zoomDisabled',\n} as const;\n\nconst PropertyKey = propertyKeys;\n\nexport type PropertyKeyType = EnumType<typeof PropertyKey>;\n\nexport { PropertyKey, propertyKeys };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst resourceKeys = {\n  resource_image: '&image',\n  resource_imageResponsive: '&imageResponsive',\n  resource_imagePortrait: '&imagePortrait',\n  resource_imageLandscape: '&imageLandscape',\n  resource_imageEmbed: '&imageEmbed',\n  resource_imageLink: '&imageLink',\n  resource_audio: '&audio',\n  resource_audioEmbed: '&audioEmbed',\n  resource_audioLink: '&audioLink',\n  resource_video: '&video',\n  resource_videoEmbed: '&videoEmbed',\n  resource_videoLink: '&videoLink',\n  resource_stillImageFilm: '&stillImageFilm',\n  resource_stillImageFilmEmbed: '&stillImageFilmEmbed',\n  resource_stillImageFilmLink: '&stillImageFilmLink',\n  resource_article: '&article',\n  resource_articleEmbed: '&articleEmbed',\n  resource_articleLink: '&articleLink',\n  resource_document: '&document',\n  resource_documentEmbed: '&documentEmbed',\n  resource_documentLink: '&documentLink',\n  resource_documentDownload: '&documentDownload',\n  resource_appLink: '&appLink',\n  resource_websiteLink: '&websiteLink',\n\n  resource_icon: '&icon',\n  resource_platformBackgroundImage: '&platformBackgroundImage',\n  resource_platformIcon: '&platformIcon',\n  resource_platformLogo: '&platformLogo',\n  resource_backgroundWallpaper: '&backgroundWallpaper',\n  resource_imagePlaceholder: '&imagePlaceholder',\n  resource_previewImage: '&previewImage',\n  resource_previewVideo: '&previewVideo',\n  resource_coverImage: '&coverImage',\n  resource_backgroundImage: '&backgroundImage',\n} as const;\n\nconst ResourceKey = resourceKeys;\n\nexport type ResourceKeyType = EnumType<typeof ResourceKey>;\n\nexport { ResourceKey, resourceKeys };\n","import { type EnumType } from '@ncoderz/superenum';\n\nimport { StringUtils } from '../../utils/StringUtils.ts';\nimport type { ConfigKeyType } from '../config/enum/ConfigKey.ts';\n\nconst ResourceType = {\n  unknown: 'unknown',\n\n  image: 'image',\n  imageResponsive: 'image-responsive',\n  imagePortrait: 'image-portrait',\n  imageLandscape: 'image-landscape',\n  imageEmbed: 'image-embed',\n  imageLink: 'image-link',\n  audio: 'audio',\n  audioEmbed: 'audio-embed',\n  audioLink: 'audio-link',\n  video: 'video',\n  videoEmbed: 'video-embed',\n  videoLink: 'video-link',\n  stillImageFilm: 'still-image-film',\n  stillImageFilmEmbed: 'still-image-film-embed',\n  stillImageFilmLink: 'still-image-film-link',\n  article: 'article',\n  articleEmbed: 'article-embed',\n  articleLink: 'article-link',\n  document: 'document',\n  documentEmbed: 'document-embed',\n  documentLink: 'document-link',\n  documentDownload: 'document-download',\n  appLink: 'app-link',\n  websiteLink: 'website-link',\n\n  // Aliases for image\n  icon: 'icon',\n  backgroundWallpaper: 'backgroundWallpaper',\n  imagePlaceholder: 'imagePlaceholder',\n  platformIcon: 'platformIcon',\n  platformLogo: 'platformLogo',\n  platformBackgroundImage: 'platformBackgroundImage',\n  previewImage: 'previewImage',\n  previewVideo: 'previewVideo',\n  coverImage: 'coverImage',\n  backgroundImage: 'backgroundImage',\n} as const;\n\nexport type ResourceTypeType = EnumType<typeof ResourceType>;\n\nfunction resourceTypeToConfigKey(type: ResourceTypeType): ConfigKeyType {\n  return `&${StringUtils.kebabToCamel(type)}` as ConfigKeyType;\n}\n\nexport { ResourceType, resourceTypeToConfigKey };\n","class StringUtils {\n  /**\n   * Check if an object is a string.\n   *\n   * @param obj - The object to check.\n   * @returns true if the object is a string, otherwise false.\n   */\n  isString(obj: unknown): boolean {\n    return typeof obj === 'string' || obj instanceof String;\n  }\n\n  /**\n   * Pass any value and convert it to a string.\n   *\n   * @param str the value to convert to a string\n   * @returns the string or an empty string if the value is undefined\n   */\n  string(str: unknown | undefined): string {\n    return str ? `${str}` : '';\n  }\n\n  /**\n   * Pass any value and convert it to a trimmed string.\n   *\n   * @param str the value to convert to a trimmed string\n   * @returns the trimmed string or an empty string if the value is undefined\n   */\n  trimmedString(str: unknown | undefined): string {\n    return this.string(str).trim();\n  }\n\n  /**\n   * Count the occurrences of a substring in a string.\n   *\n   * @param str the string to search\n   * @param subStr the substring to search for\n   * @returns the number of occurrences of the substring in the string\n   */\n  countOccurrences(str: string, subStr: string): number {\n    return str.split(subStr).length - 1;\n  }\n\n  /**\n   * Count the occurrences of a substring at the start of a string.\n   *\n   * @param str the string to search\n   * @param subStr the substring to search for\n   * @returns the number of occurrences of the substring at the start of the string\n   */\n  countOccurrencesAtStart(str: string, subStr: string): number {\n    let count = 0;\n    while (str.startsWith(subStr)) {\n      count++;\n      str = str.substring(subStr.length);\n    }\n\n    return count;\n  }\n\n  /**\n   * Count the occurrences of a substring at the end of a string.\n   *\n   * @param str the string to search\n   * @param subStr the substring to search for\n   * @returns the number of occurrences of the substring at the end of the string\n   */\n  countOccurrencesAtEnd(str: string, subStr: string): number {\n    let count = 0;\n    while (str.endsWith(subStr)) {\n      count++;\n      str = str.substring(0, str.length - subStr.length);\n    }\n\n    return count;\n  }\n\n  /**\n   * Split a string using a set of placeholders, returning an array of strings and placeholders.\n   *\n   * e.g.\n   * str = \"This {0} a {1} with lots {2} placeholders\"\n   * placeholders = [\"{0}\", \"{1}\", \"{2}\"]\n   *\n   * return = [\"This \", \"{0}\", \" a \", \"{1}\", \" with lots \", \"{2}\", \" placeholders\"]\n   *\n   * @param str\n   * @param placeholders\n   */\n  splitPlaceholders(str: string, placeholders: string[]): string[] {\n    let res: string[] = [str];\n\n    // Split all texts in texts (with key) and return new text array with key inserted at the split points\n    const splitTexts = (texts: string[], key: string): string[] => {\n      const newTexts: string[] = [];\n      for (const text of texts) {\n        const tParts = text.split(key);\n        for (let i = 0, len = tParts.length; i < len; i++) {\n          const tPart = tParts[i];\n          const lastIndex = i === len - 1;\n          newTexts.push(tPart);\n          if (!lastIndex) {\n            newTexts.push(key);\n          }\n        }\n      }\n      return newTexts;\n    };\n\n    for (const p of placeholders) {\n      res = splitTexts(res, p);\n    }\n\n    return res;\n  }\n\n  /**\n   * Return the first line of text to a specified maximum width.\n   * @argument str The string to be truncated.\n   * @argument width The maximum width of the wrapped text in characters.\n   * @returns A string containing the first line, possibly truncated.\n   */\n  firstLine(str: string, width?: number): string {\n    const result: string = str;\n\n    if (width == null) width = str.length;\n    if (width < 1 || str == null || str.length <= width) return result;\n\n    const strs = str.split(`\\n`);\n    if (strs.length > 0) {\n      return strs[0].substring(0, width);\n    }\n\n    return result;\n  }\n\n  /**\n   * Wraps the provided string input to a specified maximum width.\n   * @argument str The string to be wrapped.\n   * @argument width The maximum width of the wrapped text in characters.\n   * @returns A string array containing all lines.\n   */\n  wordWrap(str: string, width: number): string[] {\n    const result: string[] = [];\n\n    if (width < 1 || str == null || str.length <= width) return result;\n\n    const len = str.length;\n    const rangeMax = len - width; // we don't need to split after this position\n    let rangeStart = 0;\n    let subString: string;\n    while (rangeStart < rangeMax) {\n      let subLength: number;\n      const rangeEnd = rangeStart + width;\n      // First test for newlines in this range. If so, don't split on word break but on the newline.\n      const ixNewLine = str.indexOf('\\n', rangeStart);\n      if (ixNewLine > -1 && ixNewLine > rangeStart && ixNewLine < rangeEnd) {\n        subLength = ixNewLine - rangeStart;\n        subString = str.substr(rangeStart, subLength);\n        rangeStart = rangeStart + subLength + 1;\n        result.push(subString);\n        continue;\n      }\n      // No newlines. Find the last wordbreak in the range.\n      const ix = str.lastIndexOf(' ', rangeEnd); // find the last word break\n      let rangeStartNext = 0;\n      if (ix > -1 && ix != rangeStart - 1) {\n        subLength = ix - rangeStart;\n        if (subLength > 0) {\n          rangeStartNext = rangeStart + subLength + 1; // +1 to skip the whitespace\n        }\n        //else { // not needed anymore because of the maxPos check\n        //    sub = str.substr(pos);\n        //    newPos = len + 1;\n        //}\n      } else {\n        // The range has no whitespace.\n        subLength = width;\n        rangeStartNext = rangeStart + width;\n      }\n      subString = str.slice(rangeStart, rangeStart + subLength);\n      rangeStart = rangeStartNext;\n      result.push(subString.trim());\n    }\n    // Add the remainder\n    if (rangeStart < len) {\n      subString = str.slice(rangeStart);\n      result.push(subString);\n    }\n\n    return result;\n  }\n\n  /**\n   * Convert a kebab-case string to camelCase.\n   *\n   * @param str the string to convert\n   * @returns the camelCase version of the string\n   */\n  kebabToCamel(str: string): string {\n    if (!str) return str;\n    return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase());\n  }\n\n  /**\n   * Convert a camelCase string to kebab-case.\n   *\n   * @param str the string to convert\n   * @returns the kebab-case version of the string\n   */\n  camelToKebab(str: string): string {\n    if (!str) return str;\n    return str\n      .replace(/([a-z])([A-Z])/g, '$1-$2')\n      .replace(/[\\s_]+/g, '-')\n      .toLowerCase();\n  }\n}\n\nconst stringUtils = new StringUtils();\n\nexport { stringUtils as StringUtils };\n","import { type CountType } from '../enum/Count.ts';\nimport type { ConfigKeyType } from './enum/ConfigKey.ts';\nimport { type TagsConfig } from './TagsConfig.ts';\n\nclass ResourcesConfig {\n  readonly tags: TagsConfig;\n  readonly resourceAttachmentAllowed: boolean;\n  readonly resourceAttachmentConfigKey: string | undefined;\n  readonly comboResourceConfigKeysMap: Map<ConfigKeyType, ConfigKeyType[]>;\n\n  public constructor(\n    tags: TagsConfig,\n    resourceAttachmentAllowed: boolean | undefined,\n    resourceAttachmentConfigKey: ConfigKeyType | undefined,\n    comboResourceConfigKeysMap: Map<ConfigKeyType, ConfigKeyType[]>,\n  ) {\n    this.tags = tags;\n    this.resourceAttachmentAllowed = resourceAttachmentAllowed ?? false;\n    this.resourceAttachmentConfigKey = resourceAttachmentConfigKey;\n    this.comboResourceConfigKeysMap = comboResourceConfigKeysMap;\n  }\n\n  public getCountsMin(): Map<ConfigKeyType, number> {\n    const counts: Map<ConfigKeyType, number> = new Map();\n    for (const r of Object.values(this.tags)) {\n      if (r.minCount != null) {\n        counts.set(r.configKey, r.minCount);\n      }\n    }\n    return counts;\n  }\n\n  public getCountsMax(): Map<ConfigKeyType, CountType> {\n    const counts: Map<ConfigKeyType, CountType> = new Map();\n    for (const r of Object.values(this.tags)) {\n      if (r.maxCount != null) {\n        counts.set(r.configKey, r.maxCount);\n      }\n    }\n    return counts;\n  }\n}\n\nexport { ResourcesConfig };\n","export interface GetFilenamesSyncOptions {\n  match?: RegExp;\n  recursive?: boolean;\n  maxDepth?: number;\n}\n\ninterface RemoveUnwantedPropertiesOptions {\n  ignoreAllUndefined?: boolean;\n  ignoreUndefined?: string[];\n  ignoreAllFalse?: boolean;\n  ignoreFalse?: string[];\n  ignoreAllEmptyString?: boolean;\n  ignoreEmptyString?: string[];\n  ignoreAllEmptyArrays?: boolean;\n  ignoreEmptyArrays?: string[];\n  ignoreAllEmptyObjects?: boolean;\n  ignoreEmptyObjects?: string[];\n}\n\nclass ObjectUtils {\n  /**\n   * Check if a variable is a function\n   *\n   * @param val\n   * @returns true if a function\n   */\n  isFunction(val: unknown) {\n    return Object.prototype.toString.call(val) === '[object Function]';\n  }\n\n  /**\n   * Check if a variable is an array\n   *\n   * @param val\n   * @returns true if a array\n   */\n  isArray(val: unknown) {\n    return Array.isArray(val); // Object.prototype.toString.call(val) === '[object Array]';\n  }\n\n  /**\n   * Check if a variable is a date\n   *\n   * @param val\n   * @returns true if a date\n   */\n  isDate(val: unknown) {\n    return Object.prototype.toString.call(val) === '[object Date]';\n  }\n\n  /**\n   * Check if a variable is a object\n   *\n   * @param val\n   * @returns true if an object\n   */\n  isObject(val: unknown) {\n    return Object.prototype.toString.call(val) === '[object Object]';\n  }\n\n  /**\n   * Check if a variable is a value (i.e. a number)\n   *\n   * @param val\n   * @returns true if a value\n   */\n  isValue(val: unknown) {\n    return !this.isObject(val) && !this.isArray(val);\n  }\n\n  /**\n   * Get the value of a property in a plain JS object\n   * using a path string or array.\n   *\n   * @param obj the object to get a property from\n   * @param path the path to the property to set as a dotted string or array or a mix of both\n   * @returns the value of the property, or undefined if the property does not exist\n   */\n  getViaPath(obj: unknown, path: string | string[]): unknown {\n    if (!obj) return undefined;\n    if (!path) return undefined;\n    if (!Array.isArray(path)) path = [path]; // Ensure path is an array\n\n    // Split dotted paths\n    path = path.flatMap((p) => p.split('.'));\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    let node = obj as any;\n\n    for (const key of path) {\n      if (node == null) return undefined;\n      node = node[key];\n    }\n\n    return node;\n  }\n\n  /**\n   * Set the value of a property in a plain JS object\n   * using a path string or array.\n   *\n   * @param obj the object to modify\n   * @param path the path to the property to set as a dotted string or array or a mix of both\n   * @param value the value to set\n   * @param create - if true, create plain objects in the path if they do not exist\n   * @returns true if the value was set, false if the value was not set\n   */\n  setViaPath(obj: unknown, path: string | string[], value: unknown, create?: boolean): boolean {\n    if (!obj) return false;\n    if (!path) return false;\n    if (!Array.isArray(path)) path = [path]; // Ensure path is an array\n\n    // Split dotted paths\n    path = path.flatMap((p) => p.split('.'));\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    let node = obj as any;\n\n    for (let i = 0; i < path.length - 1; i++) {\n      const key = path[i];\n      if (node[key] == undefined) {\n        if (create) {\n          node[key] = {};\n        } else {\n          return false;\n        }\n      }\n      node = node[key];\n    }\n\n    node[path[path.length - 1]] = value;\n    return true;\n  }\n\n  /**\n   * Return an array of the objects at the end of the paths\n   * specified in the path array.\n   *\n   * e.g.\n   *\n   * const obj = obj = {\n   *   a: {\n   *     b: {\n   *       c: 1,\n   *     },\n   *   },\n   *   d: [{ e: 2 }, { f: 3 }],\n   *   g: [{ h: [{ i: 4 }] }, { h: [{ i: 5 }, { i: 6 }] }, { h: [{ i: 7 }] }],\n   * }\n   *\n   * objectUtils.flatMapPath(obj, ['a']);\n   * [{ b: { c: 1 }]\n   *\n   * objectUtils.flatMapPath(obj, ['a', 'b']);\n   * [{ c: 1 }]\n   *\n   * objectUtils.flatMapPath(obj, ['a', 'b', 'c']);\n   * [1]\n   *\n   * objectUtils.flatMapPath(obj, ['d']);\n   * [{ e: 2 }, { f: 3 }]\n   *\n   * objectUtils.flatMapPath(obj, ['d', 'e']);\n   * [2]\n   *\n   * objectUtils.flatMapPath(obj, ['g']);\n   * [{ h: [{ i: 4 }] }, { h: [{ i: 5 }, { i: 6 }] }, { h: [{ i: 7 }] }]\n   *\n   * objectUtils.flatMapPath(obj, ['g', 'h']);\n   * [{ i: 4 }, { i: 5 }, { i: 6 }, { i: 7 }]\n   *\n   * objectUtils.flatMapPath(obj, ['g', 'h', 'i']);\n   * [4, 5, 6, 7]\n   *\n   * @param obj\n   * @param path\n   * @returns\n   */\n  flatMapPath(obj: unknown, path: string | string[]): unknown[] {\n    if (!obj) return [];\n    if (!path) return [];\n    if (!Array.isArray(path)) path = [path]; // Ensure path is an array\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const node = obj as any;\n\n    const key = path.shift();\n    if (key == null) return node;\n    const data = node[key];\n\n    if (!data) return [];\n    if (Array.isArray(data)) {\n      return data.flatMap((d) => this.flatMapPath(d, path.slice()));\n    } else {\n      return [this.flatMapPath(data, path)].flat();\n    }\n  }\n\n  // testFlatMapPath() {\n  //   const obj = {\n  //     a: {\n  //       b: {\n  //         c: 1,\n  //       },\n  //     },\n  //     d: [{ e: 2 }, { f: 3 }],\n  //     g: [{ h: [{ i: 4 }] }, { h: [{ i: 5 }, { i: 6 }] }, { h: [{ i: 4 }] }],\n  //   };\n\n  //   console.log(this.flatMapPath(obj, 'a')); // [{ b: { c: 1 }]\n  //   console.log(this.flatMapPath(obj, ['a', 'b'])); // [{ c: 1 }]\n  //   console.log(this.flatMapPath(obj, ['a', 'b', 'c'])); // [1]\n  //   console.log(this.flatMapPath(obj, ['d'])); // [{ e: 2 }, { f: 3 }]\n  //   console.log(this.flatMapPath(obj, ['d', 'e'])); // [2]\n  //   console.log(this.flatMapPath(obj, ['g'])); // [{ h: [{ i: 4 }] }, { h: [{ i: 5 }, { i: 6 }] }, { h: [{ i: 4 }] }]\n  //   console.log(this.flatMapPath(obj, ['g', 'h'])); // [{ i: 4 }, { i: 5 }, { i: 6 }, { i: 4 }]\n  //   console.log(this.flatMapPath(obj, ['g', 'h', 'i'])); // [4, 5, 6, 4]\n  // }\n\n  /**\n   * Order the properties of a plain JS object.\n   * The original properties are removed, and re-added in the new order.\n   * Any non-specified properties are dropped.\n   *\n   * NOTE: The JS spec does not specifiy an order for property iteration, but all major JS engines including V8 which\n   * is used by NodeJS and Chrome do have a specific iteration order which is defined by the order properties are\n   * added to an object. Many applications rely on this iteration order.\n   *\n   * @param obj - object with properties to re-order\n   * @param order - array of property keys in the desired order.\n   */\n  orderProperties<T>(obj: T, order: string[]): void {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const objAsAny = obj as any;\n    const props = Object.assign({}, objAsAny);\n    for (const k of Object.keys(objAsAny)) {\n      delete objAsAny[k];\n    }\n    for (const k of order) {\n      if (Object.prototype.hasOwnProperty.call(props, k)) {\n        objAsAny[k] = props[k];\n      }\n    }\n  }\n\n  /**\n   * Remove any keys whose value is 'undefined' from a plain JS object\n   *\n   * @param obj plain JS object\n   * @param excludeKeys keys to be excluded from removal\n   */\n  removeUndefinedProperties(obj: unknown, excludeKeys?: string[]): void {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const objAsAny = obj as any;\n\n    for (const [k, v] of Object.entries(objAsAny)) {\n      if (excludeKeys && excludeKeys.indexOf(k) >= 0) continue;\n\n      if (v == undefined) {\n        delete objAsAny[k];\n      }\n    }\n  }\n\n  /**\n   * Remove any keys whose value is 'false' from a plain JS object\n   *\n   * @param obj plain JS object\n   * @param excludeKeys keys to be excluded from removal\n   */\n  removeFalseProperties(obj: unknown, excludeKeys?: string[]): void {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const objAsAny = obj as any;\n\n    for (const [k, v] of Object.entries(objAsAny)) {\n      if (excludeKeys && excludeKeys.indexOf(k) >= 0) continue;\n\n      if (v === false) {\n        delete objAsAny[k];\n      }\n    }\n  }\n\n  /**\n   * Remove any keys whose value is '' from a plain JS object\n   *\n   * @param obj plain JS object\n   * @param excludeKeys keys to be excluded from removal\n   */\n  removeEmptyStringProperties(obj: unknown, excludeKeys?: string[]): void {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const objAsAny = obj as any;\n\n    for (const [k, v] of Object.entries(objAsAny)) {\n      if (excludeKeys && excludeKeys.indexOf(k) >= 0) continue;\n\n      if (v === '') {\n        delete objAsAny[k];\n      }\n    }\n  }\n\n  /**\n   * Remove any keys whose value is '[]' from a plain JS object\n   *\n   * @param obj plain JS object\n   * @param excludeKeys keys to be excluded from removal\n   */\n  removeEmptyArrayProperties(obj: unknown, excludeKeys?: string[]): void {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const objAsAny = obj as any;\n\n    for (const [k, v] of Object.entries(objAsAny)) {\n      if (excludeKeys && excludeKeys.indexOf(k) >= 0) continue;\n\n      if (Array.isArray(v) && v.length === 0) {\n        delete objAsAny[k];\n      }\n    }\n  }\n\n  /**\n   * Remove any keys whose value is '{}' from a plain JS object\n   *\n   * @param obj plain JS object\n   * @param excludeKeys keys to be excluded from removal\n   */\n  removeEmptyObjectProperties(obj: unknown, excludeKeys?: string[]): void {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const objAsAny = obj as any;\n\n    for (const [k, v] of Object.entries(objAsAny)) {\n      if (excludeKeys && excludeKeys.indexOf(k) >= 0) continue;\n\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      if (this.isObject(v) && Object.keys(v as any).length === 0) {\n        delete objAsAny[k];\n      }\n    }\n  }\n\n  /**\n   * Remove any unwanted properties from a plain JS object\n   *\n   * @param obj plain JS object\n   * @param excludeKeys keys to be excluded from removal\n   */\n  removeUnwantedProperties(obj: unknown, options?: RemoveUnwantedPropertiesOptions): void {\n    options = Object.assign({}, options);\n\n    if (!options.ignoreAllUndefined) this.removeUndefinedProperties(obj, options.ignoreUndefined);\n    if (!options.ignoreAllFalse) this.removeFalseProperties(obj, options.ignoreFalse);\n    if (!options.ignoreAllEmptyString)\n      this.removeEmptyStringProperties(obj, options.ignoreEmptyString);\n    if (!options.ignoreAllEmptyArrays)\n      this.removeEmptyArrayProperties(obj, options.ignoreEmptyArrays);\n    if (!options.ignoreAllEmptyObjects)\n      this.removeEmptyObjectProperties(obj, options.ignoreEmptyObjects);\n  }\n\n  /**\n   * Extract a single value from a plain JS object\n   *\n   * If the item at the key is not an array, the item is returned.\n   * If the object at the key is an array, the last item in the array is returned.\n   *\n   * @param obj\n   * @param key\n   * @returns a non-array value, or undefined if the key does not exist\n   */\n  extractSingleValue(obj: unknown, key: string): unknown | undefined {\n    if (!obj) return undefined;\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const objAsAny = obj as any;\n\n    if (objAsAny[key] == undefined) return undefined;\n\n    let value = objAsAny[key];\n    if (Array.isArray(value)) {\n      if (value.length === 0) return undefined;\n      value = value[value.length - 1];\n    }\n\n    return value;\n  }\n\n  /**\n   * Deep merge two or more objects or arrays.\n   * (c) 2023 Chris Ferdinandi, MIT License, https://gomakethings.com\n   * TypeScript version (c) 2023 RA Sewell\n   *\n   * @param   objs  The arrays or objects to merge\n   * @returns The merged arrays or objects\n   */\n  public deepMerge<T>(...objs: unknown[]): T {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    function _deepMerge(...objs: any[]) {\n      /**\n       * Get the object type\n       */\n      function getType(obj: unknown) {\n        return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();\n      }\n\n      /**\n       * Deep merge two objects\n       */\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      function mergeObj(clone: any, obj: any) {\n        for (const [key, value] of Object.entries(obj)) {\n          const type = getType(value);\n          if (\n            clone[key] !== undefined &&\n            getType(clone[key]) === type &&\n            ['array', 'object'].includes(type)\n          ) {\n            clone[key] = _deepMerge(clone[key], value);\n          } else {\n            clone[key] = structuredClone(value);\n          }\n        }\n      }\n\n      // Create a clone of the first item in the objs array\n      let clone = structuredClone(objs.shift());\n\n      // Loop through each item\n      for (const obj of objs) {\n        // Get the object type\n        const type = getType(obj);\n\n        // If the current item isn't the same type as the clone, replace it\n        if (getType(clone) !== type) {\n          clone = structuredClone(obj);\n          continue;\n        }\n\n        // Otherwise, merge\n        if (type === 'array') {\n          clone = [...clone, ...structuredClone(obj)];\n        } else if (type === 'object') {\n          mergeObj(clone, obj);\n        } else {\n          clone = obj;\n        }\n      }\n\n      return clone;\n    }\n\n    return _deepMerge(...objs) as T;\n  }\n}\n\nconst objectUtils = new ObjectUtils();\n\nexport { objectUtils as ObjectUtils };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { type _AbstractTagConfig, type _CardVariantConfig } from '../model/config/_Config.ts';\nimport { CardSetConfig, type CardSetSection } from '../model/config/CardSetConfig.ts';\nimport { CardSideConfig } from '../model/config/CardSideConfig.ts';\nimport { CardVariantConfig } from '../model/config/CardVariantConfig.ts';\nimport { type CardSetConfigKeyType } from '../model/config/enum/CardSetConfigKey.ts';\nimport { ConfigKey, typeFromConfigKey } from '../model/config/enum/ConfigKey.ts';\nimport { MarkupTagConfig } from '../model/config/MarkupTagConfig.ts';\nimport { PropertyTagConfig } from '../model/config/PropertyTagConfig.ts';\nimport { ResourceTagConfig } from '../model/config/ResourceTagConfig.ts';\nimport { type TagsConfig } from '../model/config/TagsConfig.ts';\nimport { type TagsConfigWithInfo } from '../model/config/TagsConfigWithInfo.ts';\nimport { BitTagConfigKeyType } from '../model/enum/BitTagConfigKeyType.ts';\nimport { Tag } from '../model/enum/Tag.ts';\nimport { CARDS } from './raw/cardSets.ts';\nimport { GROUPS } from './raw/groups.ts';\n\nconst MAX_COUNT_DEFAULT = 1;\nconst MIN_COUNT_DEFAULT = 0;\n\nclass ConfigHydrator {\n  public hydrateTagsConfig(_tags: _AbstractTagConfig[]): TagsConfigWithInfo {\n    const tagsWithInfo: TagsConfigWithInfo = {\n      tags: {},\n    };\n\n    for (const t of _tags) {\n      let expandedTags: TagsConfigWithInfo | undefined;\n      const type = typeFromConfigKey(t.key);\n\n      switch (type) {\n        case BitTagConfigKeyType.tag:\n          expandedTags = this.hydrateTagConfig(t);\n          break;\n\n        case BitTagConfigKeyType.property:\n          expandedTags = this.hydratePropertyTagConfig(t);\n          break;\n\n        case BitTagConfigKeyType.resource:\n          expandedTags = this.hydrateResourceTagConfig(t);\n          break;\n\n        case BitTagConfigKeyType.group:\n          expandedTags = this.hydrateTagGroupConfig(t);\n          break;\n\n        default:\n          throw new Error(`Unknown tag type for config key '${t.key}'`);\n      }\n\n      if (expandedTags) {\n        tagsWithInfo.tags = {\n          ...tagsWithInfo.tags,\n          ...expandedTags.tags,\n        };\n\n        tagsWithInfo.info = Object.assign(tagsWithInfo.info ?? {}, expandedTags.info);\n      }\n    }\n\n    return tagsWithInfo;\n  }\n\n  public hydrateCardSetConfig(\n    _cardSet: CardSetConfigKeyType | undefined,\n  ): CardSetConfig | undefined {\n    if (!_cardSet) return undefined;\n    const _cardSetConfig = CARDS[_cardSet];\n    if (!_cardSetConfig) throw new Error(`No config found for card set config key '${_cardSet}'`);\n\n    const sides: CardSideConfig[] = [];\n\n    for (const _side of _cardSetConfig.sides) {\n      const variantsOfSide: CardVariantConfig[] = [];\n      for (const _variant of _side.variants) {\n        const v = this.hydrateCardVariantConfig(_variant);\n        variantsOfSide.push(v);\n      }\n      const sideConfig = new CardSideConfig(\n        _side.name,\n        _side.repeat ?? false,\n        variantsOfSide,\n        _side.jsonKey,\n        _side.exportJsonKey,\n        Object.prototype.hasOwnProperty.call(_side, 'exportJsonKey'),\n        _side.htmlKey,\n        Object.prototype.hasOwnProperty.call(_side, 'htmlKey'),\n      );\n      sides.push(sideConfig);\n    }\n\n    const cardSetConfig = new CardSetConfig(\n      _cardSet,\n      _cardSetConfig.jsonKey,\n      _cardSetConfig.exportJsonKey,\n      Object.prototype.hasOwnProperty.call(_cardSetConfig, 'exportJsonKey'),\n      this.hydrateCardSections(_cardSetConfig.sections),\n      sides,\n      _cardSetConfig.htmlKey,\n      Object.prototype.hasOwnProperty.call(_cardSetConfig, 'htmlKey'),\n    );\n\n    return cardSetConfig;\n  }\n\n  private hydrateCardSections(\n    sections: NonNullable<(typeof CARDS)[string]['sections']> | undefined,\n  ): Record<string, CardSetSection> | undefined {\n    if (!sections) return undefined;\n    const out: Record<string, CardSetSection> = {};\n    for (const [k, v] of Object.entries(sections)) {\n      out[k] = {\n        jsonKey: v.jsonKey,\n        exportJsonKey: v.exportJsonKey,\n        hasExportJsonKey: Object.prototype.hasOwnProperty.call(v, 'exportJsonKey'),\n        htmlKey: v.htmlKey,\n        hasHtmlKey: Object.prototype.hasOwnProperty.call(v, 'htmlKey'),\n        isDefault: v.isDefault,\n        sideJsonKey: v.sideJsonKey,\n        sideExportJsonKey: v.sideExportJsonKey,\n        hasSideExportJsonKey: Object.prototype.hasOwnProperty.call(v, 'sideExportJsonKey'),\n        sideHtmlKey: v.sideHtmlKey,\n        hasSideHtmlKey: Object.prototype.hasOwnProperty.call(v, 'sideHtmlKey'),\n        // PLAN-085: cardinality fields pass through; defaults applied\n        // downstream by the config consumer (Rust treats `0` / undefined\n        // as unbounded).\n        minCount: v.minCount,\n        maxCount: v.maxCount,\n      };\n    }\n    return out;\n  }\n\n  private hydrateTagConfig(_tag: _AbstractTagConfig): TagsConfigWithInfo {\n    const {\n      key: _configKey,\n      maxCount,\n      minCount,\n      chain: _chain,\n      deprecated,\n      jsonKey,\n      exportJsonKey,\n      htmlKey,\n    } = _tag;\n    const configKey = Enum(ConfigKey).fromValue(_configKey) || ConfigKey._unknown;\n    if (!configKey) throw new Error(`No tag key found for config key '${configKey}'`);\n    const tag = Enum(Tag).fromValue(configKey);\n    if (!tag) throw new Error(`No tag found for tag config key '${configKey}'`);\n\n    let chain: TagsConfig | undefined;\n\n    if (_chain) {\n      chain = this.hydrateTagsConfig(_chain).tags;\n    }\n\n    const hydratedTag = new MarkupTagConfig({\n      configKey,\n      tag,\n      maxCount: maxCount ?? MAX_COUNT_DEFAULT,\n      minCount: minCount ?? MIN_COUNT_DEFAULT,\n      chain,\n      jsonKey,\n      exportJsonKey,\n      hasExportJsonKey: Object.prototype.hasOwnProperty.call(_tag, 'exportJsonKey'),\n      htmlKey,\n      hasHtmlKey: Object.prototype.hasOwnProperty.call(_tag, 'htmlKey'),\n      deprecated,\n    });\n\n    return {\n      tags: {\n        [configKey]: hydratedTag,\n      },\n    };\n  }\n\n  private hydratePropertyTagConfig(_tag: _AbstractTagConfig): TagsConfigWithInfo {\n    const {\n      key: _configKey,\n      maxCount,\n      minCount,\n      chain: _chain,\n      deprecated,\n      format,\n      values,\n      defaultValue,\n      jsonKey,\n      exportJsonKey,\n      htmlKey,\n    } = _tag;\n    const configKey = Enum(ConfigKey).fromValue(_configKey) || ConfigKey._unknown;\n    if (!configKey) throw new Error(`No property key found for config key '${configKey}'`);\n    const tag = _configKey.substring(1); // Remove the '@' prefix from the config key\n\n    let chain: TagsConfig | undefined;\n\n    if (_chain) {\n      chain = this.hydrateTagsConfig(_chain).tags;\n    }\n\n    const hydratedTag = new PropertyTagConfig({\n      configKey,\n      tag,\n      maxCount: maxCount ?? MAX_COUNT_DEFAULT,\n      minCount: minCount ?? MIN_COUNT_DEFAULT,\n      chain,\n      jsonKey,\n      exportJsonKey,\n      hasExportJsonKey: Object.prototype.hasOwnProperty.call(_tag, 'exportJsonKey'),\n      htmlKey,\n      hasHtmlKey: Object.prototype.hasOwnProperty.call(_tag, 'htmlKey'),\n      format,\n      values,\n      defaultValue,\n      deprecated,\n    });\n\n    return {\n      tags: {\n        [configKey]: hydratedTag,\n      },\n    };\n  }\n\n  private hydrateResourceTagConfig(_tag: _AbstractTagConfig): TagsConfigWithInfo {\n    const {\n      key: _configKey,\n      maxCount,\n      minCount,\n      chain: _chain,\n      deprecated,\n      jsonKey,\n      exportJsonKey,\n      htmlKey,\n    } = _tag;\n    const configKey = Enum(ConfigKey).fromValue(_configKey) || ConfigKey._unknown;\n    if (!configKey) throw new Error(`No resource key found for config key '${configKey}'`);\n    const tag = _configKey.substring(1); // Remove the '&' prefix from the config key\n\n    let chain: TagsConfig | undefined;\n\n    if (_chain) {\n      chain = this.hydrateTagsConfig(_chain).tags;\n    }\n\n    const hydratedTag = new ResourceTagConfig({\n      configKey,\n      tag,\n      maxCount: maxCount ?? MAX_COUNT_DEFAULT,\n      minCount: minCount ?? MIN_COUNT_DEFAULT,\n      chain,\n      jsonKey,\n      exportJsonKey,\n      hasExportJsonKey: Object.prototype.hasOwnProperty.call(_tag, 'exportJsonKey'),\n      htmlKey,\n      hasHtmlKey: Object.prototype.hasOwnProperty.call(_tag, 'htmlKey'),\n      deprecated,\n    });\n\n    return {\n      tags: {\n        [configKey]: hydratedTag,\n      },\n    };\n  }\n\n  private hydrateTagGroupConfig(_tag: _AbstractTagConfig): TagsConfigWithInfo {\n    const { key: _configKey } = _tag;\n    const configKey = Enum(ConfigKey).fromValue(_configKey) || ConfigKey._unknown;\n    if (!configKey) throw new Error(`No group key found for config key '${configKey}'`);\n    const _groupConfig = GROUPS[configKey];\n    if (!_groupConfig) throw new Error(`No config found for group config key '${_configKey}'`);\n    const { tags: _tags } = _groupConfig;\n\n    const tags = this.hydrateTagsConfig(_tags).tags;\n\n    // Apply the groups min/max to the first tag in the group (overriding the default value)\n    const tagValues = Object.values(tags);\n    if (tagValues.length > 0) {\n      const firstTag = tagValues[0];\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const firstTagAny = firstTag as any;\n      firstTagAny.maxCount = _tag.maxCount ?? firstTag.maxCount;\n      firstTagAny.minCount = _tag.minCount ?? firstTag.minCount;\n    }\n\n    return {\n      tags,\n      info: {\n        comboResourceConfigKey: _groupConfig.comboResourceConfigKey,\n      },\n    };\n  }\n\n  private hydrateCardVariantConfig(_variant: _CardVariantConfig): CardVariantConfig {\n    const {\n      tags: _tags,\n      bodyAllowed,\n      bodyRequired,\n      repeatCount,\n      jsonKey,\n      exportJsonKey,\n      htmlKey,\n      format,\n    } = _variant;\n\n    const tags = this.hydrateTagsConfig(_tags);\n\n    const cardSetConfig = new CardVariantConfig(\n      tags.tags,\n      bodyAllowed,\n      bodyRequired,\n      repeatCount,\n      jsonKey,\n      exportJsonKey,\n      Object.prototype.hasOwnProperty.call(_variant, 'exportJsonKey'),\n      format,\n      htmlKey,\n      Object.prototype.hasOwnProperty.call(_variant, 'htmlKey'),\n    );\n\n    return cardSetConfig;\n  }\n}\n\nconst instance = new ConfigHydrator();\n\nexport { instance as ConfigHydrator };\n","import { type _CardSetsConfig } from '../../model/config/_Config.ts';\nimport { CardSetConfigKey } from '../../model/config/enum/CardSetConfigKey.ts';\nimport { ConfigKey } from '../../model/config/enum/ConfigKey.ts';\nimport { Count } from '../../model/enum/Count.ts';\nimport { TagFormat } from '../../model/enum/TagFormat.ts';\nimport { TextFormat } from '../../model/enum/TextFormat.ts';\n\nconst CARDSETS: _CardSetsConfig = {\n  //\n  // flashcard\n  //\n  [CardSetConfigKey.flashcard]: {\n    jsonKey: 'cards',\n    exportJsonKey: { cards: '$' },\n    sides: [\n      {\n        name: 'question',\n        variants: [\n          {\n            jsonKey: 'question.text',\n            exportJsonKey: [{ '@absent': { question: {} } }, { question: { text: '$' } }],\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the flashcard.',\n              },\n              {\n                exportJsonKey: { title: '$' },\n                key: ConfigKey.tag_title,\n                description: 'Title of the flashcard.',\n              },\n              {\n                key: ConfigKey.group_resourceIcon,\n                description: 'Icon resource for the flashcard.',\n                jsonKey: 'question.icon|resource(type=image, key=image)',\n                exportJsonKey: { question: { icon: { type: 'image', image: { src: '$' } } } },\n              },\n              {\n                key: ConfigKey.property_example,\n                exportJsonKey: [\n                  { '@keyonly': { isExample: true, example: true, '@bit': { isExample: true } } },\n                  { '@absent': { isExample: true, example: true, '@bit': { isExample: true } } },\n                  { isExample: true, example: '$', '@bit': { isExample: true } },\n                ],\n                description: 'Example marker for the flashcard question.',\n                format: TagFormat.bitmarkText,\n                nullable: true,\n              },\n            ],\n          },\n        ],\n      },\n      {\n        name: 'answer',\n        variants: [\n          {\n            jsonKey: 'answer.text',\n            exportJsonKey: [{ '@absent': { answer: {} } }, { answer: { text: '$' } }],\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the flashcard.',\n              },\n              {\n                exportJsonKey: { title: '$' },\n                key: ConfigKey.tag_title,\n                description: 'Title of the flashcard.',\n              },\n              {\n                key: ConfigKey.group_resourceIcon,\n                description: 'Icon resource for the flashcard.',\n                jsonKey: 'answer.icon|resource(type=image, key=image)',\n                exportJsonKey: { answer: { icon: { type: 'image', image: { src: '$' } } } },\n              },\n              {\n                key: ConfigKey.property_example,\n                exportJsonKey: [\n                  { '@keyonly': { isExample: true, example: true, '@bit': { isExample: true } } },\n                  { '@absent': { isExample: true, example: true, '@bit': { isExample: true } } },\n                  { isExample: true, example: '$', '@bit': { isExample: true } },\n                ],\n                description: 'Example marker for the flashcard answer.',\n                format: TagFormat.bitmarkText,\n                nullable: true,\n              },\n            ],\n          },\n          {\n            jsonKey: 'alternativeAnswers[].text',\n            exportJsonKey: { alternativeAnswers: [{ text: '$' }] },\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the flashcard.',\n              },\n              {\n                exportJsonKey: { title: '$' },\n                key: ConfigKey.tag_title,\n                description: 'Title of the flashcard.',\n              },\n              {\n                key: ConfigKey.group_resourceIcon,\n                description: 'Icon resource for the flashcard.',\n                jsonKey: 'alternativeAnswers[].icon|resource(type=image, key=image)',\n                exportJsonKey: {\n                  alternativeAnswers: [{ icon: { type: 'image', image: { src: '$' } } }],\n                },\n              },\n            ],\n            repeatCount: Count.infinity,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // flashcard1 — single-card variant of flashcard. Same shape, but capped\n  // at one card via `sections.default.maxCount = 1` (PLAN-085). Used by\n  // the `flashcard-1` bit type; the multi-card `flashcard` and\n  // `q-and-a-card` bit types continue to use the unbounded `flashcard`\n  // cardset.\n  //\n  [CardSetConfigKey.flashcard1]: {\n    jsonKey: 'cards',\n    exportJsonKey: { cards: '$' },\n    sections: {\n      default: {\n        jsonKey: 'cards',\n        exportJsonKey: { cards: '$' },\n        isDefault: true,\n        maxCount: 1,\n      },\n    },\n    sides: [\n      {\n        name: 'question',\n        variants: [\n          {\n            jsonKey: 'question.text',\n            exportJsonKey: [{ '@absent': { question: {} } }, { question: { text: '$' } }],\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the flashcard.',\n              },\n              {\n                exportJsonKey: { title: '$' },\n                key: ConfigKey.tag_title,\n                description: 'Title of the flashcard.',\n              },\n              {\n                key: ConfigKey.group_resourceIcon,\n                description: 'Icon resource for the flashcard.',\n                jsonKey: 'question.icon|resource(type=image, key=image)',\n                exportJsonKey: { question: { icon: { type: 'image', image: { src: '$' } } } },\n              },\n              {\n                key: ConfigKey.property_example,\n                exportJsonKey: [\n                  { '@keyonly': { isExample: true, example: true, '@bit': { isExample: true } } },\n                  { '@absent': { isExample: true, example: true, '@bit': { isExample: true } } },\n                  { isExample: true, example: '$', '@bit': { isExample: true } },\n                ],\n                description: 'Example marker for the flashcard question.',\n                format: TagFormat.bitmarkText,\n                nullable: true,\n              },\n            ],\n          },\n        ],\n      },\n      {\n        name: 'answer',\n        variants: [\n          {\n            jsonKey: 'answer.text',\n            exportJsonKey: [{ '@absent': { answer: {} } }, { answer: { text: '$' } }],\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the flashcard.',\n              },\n              {\n                exportJsonKey: { title: '$' },\n                key: ConfigKey.tag_title,\n                description: 'Title of the flashcard.',\n              },\n              {\n                key: ConfigKey.group_resourceIcon,\n                description: 'Icon resource for the flashcard.',\n                jsonKey: 'answer.icon|resource(type=image, key=image)',\n                exportJsonKey: { answer: { icon: { type: 'image', image: { src: '$' } } } },\n              },\n              {\n                key: ConfigKey.property_example,\n                exportJsonKey: [\n                  { '@keyonly': { isExample: true, example: true, '@bit': { isExample: true } } },\n                  { '@absent': { isExample: true, example: true, '@bit': { isExample: true } } },\n                  { isExample: true, example: '$', '@bit': { isExample: true } },\n                ],\n                description: 'Example marker for the flashcard answer.',\n                format: TagFormat.bitmarkText,\n                nullable: true,\n              },\n            ],\n          },\n          {\n            jsonKey: 'alternativeAnswers[].text',\n            exportJsonKey: { alternativeAnswers: [{ text: '$' }] },\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the flashcard.',\n              },\n              {\n                exportJsonKey: { title: '$' },\n                key: ConfigKey.tag_title,\n                description: 'Title of the flashcard.',\n              },\n              {\n                key: ConfigKey.group_resourceIcon,\n                description: 'Icon resource for the flashcard.',\n                jsonKey: 'alternativeAnswers[].icon|resource(type=image, key=image)',\n                exportJsonKey: {\n                  alternativeAnswers: [{ icon: { type: 'image', image: { src: '$' } } }],\n                },\n              },\n            ],\n            repeatCount: Count.infinity,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // definition-list\n  //\n  [CardSetConfigKey.definitionList]: {\n    jsonKey: 'definitions',\n    exportJsonKey: { definitions: '$' },\n    // PLAN-141 F1 (NISO import): each <def-item> is one card; the sides\n    // read <term>/<def>; the enclosing <legend>'s <title> lands on the\n    // term side's heading tag ([#Key] header card).\n    // PLAN-141 F3: a <tbx:langSet> is ALSO one card (a terminology entry —\n    // its enclosing <tbx:termEntry> is a transparent claim wrapper); its\n    // children compose the term/definition sides via the side rules below.\n    mappingKeys: {\n      'xml-niso-iec': [\n        { '@el': 'def-item', '@children': '$' },\n        { '@el': 'tbx:langSet', '@children': '$' },\n      ],\n    },\n    sides: [\n      {\n        name: 'term',\n        // F3: every <tbx:tig>'s <tbx:term> STACKS one-per-line onto the\n        // single term side (the \"$\\n\" template's authored separator; the\n        // trailing one is trimmed) — the PDF's Maus/Mus/M/Müsli stack.\n        mappingKeys: {\n          'xml-niso-iec': [\n            { '@el': 'term', '@text': '$' },\n            { '@el': 'tbx:tig', '@children': { '@el': 'tbx:term', '@text': '$\\n' } },\n          ],\n        },\n        variants: [\n          {\n            jsonKey: 'term.text',\n            exportJsonKey: [{ '@absent': { term: {} } }, { term: { text: '$' } }],\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the definition.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the definition.',\n                format: TagFormat.plainText,\n                nullable: true,\n                jsonKey: '^heading.forKeys',\n                exportJsonKey: { '@bit': { heading: { forKeys: '$' } } },\n                mappingKeys: { 'xml-niso-iec': { '@el': 'title', '@text': '$' } },\n              },\n              {\n                key: ConfigKey.group_resourceIcon,\n                description: 'Icon resource for the definition.',\n                format: TagFormat.plainText,\n                jsonKey: 'term.icon|resource(type=image, key=image)',\n                exportJsonKey: { term: { icon: { type: 'image', image: { src: '$' } } } },\n              },\n              {\n                key: ConfigKey.property_example,\n                exportJsonKey: [\n                  { '@keyonly': { isExample: true, example: true, '@bit': { isExample: true } } },\n                  { '@absent': { isExample: true, example: true, '@bit': { isExample: true } } },\n                  { isExample: true, example: '$', '@bit': { isExample: true } },\n                ],\n                description: 'Example marker for the definition term.',\n                format: TagFormat.bitmarkText,\n                nullable: true,\n              },\n            ],\n          },\n        ],\n      },\n      {\n        name: 'definition',\n        // F3: the definition side COMPOSES from the entry's fields in\n        // document order, with the ES-rendered locale affixes AUTHORED as\n        // value-position templates (never engine text): the subject field\n        // in ⟨⟩ glues (trailing space) onto the definition line; example /\n        // notes / source follow as blank-line-separated lines. The TBX\n        // grammar flags (normativeAuthorization, termType, partOfSpeech,\n        // grammaticalNumber) are unrendered machine-only data — dropped and\n        // recorded (catalog R-2, reviewed under D7 max-preservation).\n        mappingKeys: {\n          'xml-niso-iec': [\n            { '@el': 'def', '@children': '$' },\n            { '@el': 'tbx:subjectField', '@text': '⟨$⟩ ' },\n            { '@el': 'tbx:definition', '@children': '$' },\n            { '@el': 'tbx:example', '@children': 'BEISPIEL $' },\n            { '@el': 'tbx:note', '@children': 'Anmerkung zu Begriff: $' },\n            { '@el': 'tbx:source', '@text': '[QUELLE: $]' },\n          ],\n        },\n        variants: [\n          {\n            jsonKey: 'definition.text',\n            exportJsonKey: [{ '@absent': { definition: {} } }, { definition: { text: '$' } }],\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the definition.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the definition.',\n                format: TagFormat.plainText,\n                nullable: true,\n                jsonKey: '^heading.forValues',\n                exportJsonKey: { '@bit': { heading: { forValues: '$' } } },\n              },\n              {\n                key: ConfigKey.group_resourceIcon,\n                description: 'Icon resource for the definition.',\n                jsonKey: 'definition.icon|resource(type=image, key=image)',\n                exportJsonKey: { definition: { icon: { type: 'image', image: { src: '$' } } } },\n              },\n              {\n                key: ConfigKey.property_example,\n                exportJsonKey: [\n                  { '@keyonly': { isExample: true, example: true, '@bit': { isExample: true } } },\n                  { '@absent': { isExample: true, example: true, '@bit': { isExample: true } } },\n                  { isExample: true, example: '$', '@bit': { isExample: true } },\n                ],\n                description: 'Example marker for the definition.',\n                format: TagFormat.bitmarkText,\n                nullable: true,\n              },\n            ],\n          },\n          {\n            jsonKey: 'alternativeDefinitions[].text',\n            exportJsonKey: { alternativeDefinitions: [{ text: '$' }] },\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the definition.',\n              },\n              {\n                exportJsonKey: { title: '$' },\n                key: ConfigKey.tag_title,\n                description: 'Title of the definition.',\n              },\n              {\n                key: ConfigKey.group_resourceIcon,\n                description: 'Icon resource for the definition.',\n                jsonKey: 'alternativeDefinitions[].icon|resource(type=image, key=image)',\n                exportJsonKey: {\n                  alternativeDefinitions: [{ icon: { type: 'image', image: { src: '$' } } }],\n                },\n              },\n            ],\n            repeatCount: Count.infinity,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // definition-list-plain\n  //\n  // Same shape as `definitionList`, but every variant body is rendered as\n  // plain text (string), not bitmark+ AST. Used by\n  // `meta-search-default-terms` / `meta-search-default-topics`, which need\n  // term/definition text emitted verbatim instead of as a ProseMirror tree.\n  //\n  [CardSetConfigKey.definitionListPlain]: {\n    jsonKey: 'definitions',\n    exportJsonKey: { definitions: '$' },\n    sides: [\n      {\n        name: 'term',\n        variants: [\n          {\n            jsonKey: 'term.text',\n            exportJsonKey: [{ '@absent': { term: {} } }, { term: { text: '$' } }],\n            format: TextFormat.plainText,\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the definition.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the definition.',\n                format: TagFormat.plainText,\n                nullable: true,\n                jsonKey: '^heading.forKeys',\n                exportJsonKey: { '@bit': { heading: { forKeys: '$' } } },\n              },\n              {\n                key: ConfigKey.group_resourceIcon,\n                description: 'Icon resource for the definition.',\n                format: TagFormat.plainText,\n                jsonKey: 'term.icon|resource(type=image, key=image)',\n                exportJsonKey: { term: { icon: { type: 'image', image: { src: '$' } } } },\n              },\n              {\n                key: ConfigKey.property_example,\n                exportJsonKey: [\n                  { '@keyonly': { isExample: true, example: true, '@bit': { isExample: true } } },\n                  { '@absent': { isExample: true, example: true, '@bit': { isExample: true } } },\n                  { isExample: true, example: '$', '@bit': { isExample: true } },\n                ],\n                description: 'Example marker for the definition term.',\n                format: TagFormat.bitmarkText,\n                nullable: true,\n              },\n            ],\n          },\n        ],\n      },\n      {\n        name: 'definition',\n        variants: [\n          {\n            jsonKey: 'definition.text',\n            exportJsonKey: [{ '@absent': { definition: {} } }, { definition: { text: '$' } }],\n            format: TextFormat.plainText,\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the definition.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the definition.',\n                format: TagFormat.plainText,\n                nullable: true,\n                jsonKey: '^heading.forValues',\n                exportJsonKey: { '@bit': { heading: { forValues: '$' } } },\n              },\n              {\n                key: ConfigKey.group_resourceIcon,\n                description: 'Icon resource for the definition.',\n                jsonKey: 'definition.icon|resource(type=image, key=image)',\n                exportJsonKey: { definition: { icon: { type: 'image', image: { src: '$' } } } },\n              },\n              {\n                key: ConfigKey.property_example,\n                exportJsonKey: [\n                  { '@keyonly': { isExample: true, example: true, '@bit': { isExample: true } } },\n                  { '@absent': { isExample: true, example: true, '@bit': { isExample: true } } },\n                  { isExample: true, example: '$', '@bit': { isExample: true } },\n                ],\n                description: 'Example marker for the definition.',\n                format: TagFormat.bitmarkText,\n                nullable: true,\n              },\n            ],\n          },\n          {\n            jsonKey: 'alternativeDefinitions[].text',\n            exportJsonKey: { alternativeDefinitions: [{ text: '$' }] },\n            format: TextFormat.plainText,\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the definition.',\n              },\n              {\n                exportJsonKey: { title: '$' },\n                key: ConfigKey.tag_title,\n                description: 'Title of the definition.',\n              },\n              {\n                key: ConfigKey.group_resourceIcon,\n                description: 'Icon resource for the definition.',\n                jsonKey: 'alternativeDefinitions[].icon|resource(type=image, key=image)',\n                exportJsonKey: {\n                  alternativeDefinitions: [{ icon: { type: 'image', image: { src: '$' } } }],\n                },\n              },\n            ],\n            repeatCount: Count.infinity,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // match-pairs\n  //\n  [CardSetConfigKey.matchPairs]: {\n    jsonKey: 'pairs',\n    exportJsonKey: { pairs: '$' },\n    sides: [\n      {\n        name: 'key',\n        variants: [\n          {\n            jsonKey: 'key',\n            exportJsonKey: { key: '$' },\n            format: TextFormat.plainText,\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the match pair.',\n              },\n              {\n                // Pair-level example: emit `isExample` alongside `example`\n                // (matches OLD parser's per-pair allow-list behaviour).\n                //\n                // PLAN-074: a valued cascade source (`[@example:V]` anywhere\n                // in the cardset) fills each pair's `example` with `V`\n                // once per pair from the keys-side cascade fire (single\n                // parsed_variant per pair — no per-value duplication).\n                //\n                // PLAN-076 NOTE: matchPairs (TAG 415) KEEPS `example: '$'`\n                // at the pair-object level. BPG `parseMatchPairs`\n                // (`CardContentProcessor.ts:714-723`) emits ONE example\n                // per PAIR (the `exampleCard` accumulator), placed at the\n                // pair object. Unlike matchMatrix (per-cell example),\n                // matchPairs has no nested per-cell layer, so the pair-key\n                // `[@example:V]` must double-emit as the visible field.\n                // Confirmed via `chaining` fixture: `match-solution-grouped`\n                // expects `example: \"packen\"` at pair-object level from\n                // `die Koffer[%1][@example:packen]`. Original PLAN-076\n                // draft applied to both keys-side tags; the matchPairs\n                // half was reverted after fixture parity testing.\n                key: ConfigKey.property_example,\n                exportJsonKey: [\n                  { '@keyonly': { isExample: true, '@bit': { isExample: true } } },\n                  {\n                    predicates: ['@absent', { $cascade: '*' }],\n                    rule: {\n                      isExample: true,\n                      example: '$cascade',\n                      '@bit': { isExample: true },\n                    },\n                  },\n                  { '@absent': { isExample: true } },\n                  { isExample: true, example: '$', '@bit': { isExample: true } },\n                ],\n                description: 'Example marker / value on the match pair.',\n                format: TagFormat.bitmarkText,\n                nullable: true,\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the match pair.',\n                format: TagFormat.plainText,\n                nullable: true,\n                jsonKey: '^heading.forKeys',\n                exportJsonKey: { '@bit': { heading: { forKeys: '$' } } },\n              },\n              {\n                // PLAN-084: gate the key-side `@absent → $ancestor` cascade\n                // synth with `@variantLacksTag=isCaseSensitive` so the rule\n                // only fires when NO variant in the active card explicitly\n                // carries `[@isCaseSensitive]`. When a value-side variant\n                // carries the tag (e.g. `[@isCaseSensitive:false]`), the\n                // synth is skipped here; the value-side explicit fire owns\n                // the pair-level emission.\n                key: ConfigKey.property_isCaseSensitive,\n                exportJsonKey: [\n                  {\n                    predicates: ['@absent', { '@variantLacksTag': '@isCaseSensitive' }],\n                    rule: { isCaseSensitive: '$ancestor' },\n                  },\n                  { isCaseSensitive: '$' },\n                ],\n                description: 'Property to indicate if the match is case sensitive.',\n                format: TagFormat.boolean,\n              },\n              {\n                key: ConfigKey.resource_audio,\n                description: 'Audio resource for the match pair.',\n                jsonKey: 'keyAudio',\n                exportJsonKey: { keyAudio: '$' },\n              },\n              {\n                key: ConfigKey.resource_image,\n                description: 'Image resource for the match pair.',\n                jsonKey: 'keyImage',\n                exportJsonKey: { keyImage: '$' },\n              },\n            ],\n          },\n        ],\n      },\n      {\n        name: 'values',\n        repeat: true,\n        variants: [\n          {\n            jsonKey: 'values[]',\n            exportJsonKey: { values: ['$'] },\n            format: TextFormat.plainText,\n            tags: [\n              {\n                // PLAN-084: value-side excludes item/lead/pageNumber/marginNumber.\n                // BPG `parseMatchPairs` does `delete tags.item; delete tags.lead;`\n                // for sideIdx > 0; the schema-side equivalent is to use a\n                // group_standardTags variant that omits group_standardItemLead.\n                key: ConfigKey.group_standardTagsNoItemLead,\n                description: 'Standard tags for the match pair (values side, no item/lead).',\n              },\n              {\n                // PLAN-072 + ALIGN-EXAMPLE-CASCADE §3.6: cascade-fired\n                // `@example` from the bit header fills each pair's\n                // `example` with the pair's first value (mirrors BPG's\n                // `fillStringExample(pairs, __defaultExample=values[0])`).\n                //\n                // PLAN-074: the cascade-source-VALUE branch is handled by\n                // TAG 415 (keys side) which fires once per pair — keeping\n                // it here would emit `example` twice per pair (one per\n                // values-side parsed_variant) and merge them into a\n                // multi-paragraph array.\n                //\n                // PLAN-075: bare `$parent` reads the parent variant fire's\n                // source `$` value (the current `++`-iteration's value\n                // text). For single-value pairs this matches the old\n                // `$parent.values[0]`; for multi-value pairs with\n                // `[@example]` attached to a non-first value, it correctly\n                // resolves to that value.\n                //\n                // PLAN-077: dual `[@absent, { '$cascade': '*' }]` rule\n                // routes pair-key `[@example:V]` (a per-pair cascade\n                // source, bound via per-card CascadeCounters scope) and\n                // bit-header `[@example:V]` (cardset cascade) into the\n                // pair-level `example` via `$cascade`. The aggregator in\n                // `populate_variants` fires this rule ONCE per pair (BPG\n                // `parseMatchPairs` `exampleCard` precedence), avoiding\n                // per-iter pollution.\n                key: ConfigKey.property_example,\n                exportJsonKey: [\n                  // PLAN-084: bare `[@example]` on a values-side variant fires\n                  // once per pair (first-wins, mirrors BPG `parseMatchPairs`\n                  // `exampleCard` + `pushDownTree` set-if-null semantic).\n                  // `maxEmits: 1` enforced inside the per-pair cascade-counter\n                  // scope opened by `build_card_item`.\n                  {\n                    predicates: ['@keyonly'],\n                    maxEmits: 1,\n                    rule: {\n                      isExample: true,\n                      example: '$parent',\n                      '@bit': { isExample: true },\n                    },\n                  },\n                  {\n                    predicates: ['@absent', { $cascade: '*' }],\n                    rule: {\n                      isExample: true,\n                      example: '$cascade',\n                      '@bit': { isExample: true },\n                    },\n                  },\n                  {\n                    '@absent': {\n                      isExample: true,\n                      example: '$parent',\n                      '@bit': { isExample: true },\n                    },\n                  },\n                  // PLAN-084: same cap applies to the explicit-value `[@example:V]`\n                  // form so per-`++`-iter values-side fires also first-win.\n                  {\n                    predicates: [],\n                    maxEmits: 1,\n                    rule: { isExample: true, example: '$', '@bit': { isExample: true } },\n                  },\n                ],\n                description: 'Example marker / value on the match pair (values side).',\n                format: TagFormat.bitmarkText,\n                nullable: true,\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the match pair.',\n                format: TagFormat.plainText,\n                nullable: true,\n                jsonKey: '^heading.forValues',\n                exportJsonKey: { '@bit': { heading: { forValues: '$' } } },\n              },\n              {\n                // PLAN-084: symmetric @variantLacksTag gating with the key-side.\n                key: ConfigKey.property_isCaseSensitive,\n                exportJsonKey: [\n                  {\n                    predicates: ['@absent', { '@variantLacksTag': '@isCaseSensitive' }],\n                    rule: { isCaseSensitive: '$ancestor' },\n                  },\n                  { isCaseSensitive: '$' },\n                ],\n                description: 'Property to indicate if the match is case sensitive.',\n                format: TagFormat.boolean,\n              },\n            ],\n            repeatCount: Count.infinity,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // match-audio-pairs\n  //\n  [CardSetConfigKey.matchAudioPairs]: {\n    jsonKey: 'pairs',\n    exportJsonKey: { pairs: '$' },\n    sides: [\n      {\n        name: 'key',\n        variants: [\n          {\n            jsonKey: 'key',\n            exportJsonKey: { key: '$' },\n            format: TextFormat.plainText,\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the audio match pair.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the audio match pair.',\n                format: TagFormat.plainText,\n                nullable: true,\n                jsonKey: '^heading.forKeys',\n                exportJsonKey: { '@bit': { heading: { forKeys: '$' } } },\n              },\n              {\n                key: ConfigKey.resource_audio,\n                description: 'Audio resource for the match pair.',\n                jsonKey: 'keyAudio',\n                exportJsonKey: { keyAudio: '$' },\n              },\n            ],\n          },\n        ],\n      },\n      {\n        name: 'values',\n        repeat: true,\n        variants: [\n          {\n            jsonKey: 'values[]',\n            exportJsonKey: { values: ['$'] },\n            format: TextFormat.plainText,\n            tags: [\n              {\n                // PLAN-084: value-side excludes item/lead/pageNumber/marginNumber.\n                key: ConfigKey.group_standardTagsNoItemLead,\n                description: 'Standard tags for the audio match pair (values side, no item/lead).',\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the audio match pair.',\n                format: TagFormat.plainText,\n                nullable: true,\n                jsonKey: '^heading.forValues',\n                exportJsonKey: { '@bit': { heading: { forValues: '$' } } },\n              },\n              {\n                key: ConfigKey.resource_audio,\n                description: 'Audio resource for the match pair.',\n              },\n            ],\n            repeatCount: Count.infinity,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // match-image-pairs\n  //\n  [CardSetConfigKey.matchImagePairs]: {\n    jsonKey: 'pairs',\n    exportJsonKey: { pairs: '$' },\n    sides: [\n      {\n        name: 'key',\n        variants: [\n          {\n            jsonKey: 'key',\n            exportJsonKey: { key: '$' },\n            format: TextFormat.plainText,\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the image match pair.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the image match pair.',\n                format: TagFormat.plainText,\n                nullable: true,\n                jsonKey: '^heading.forKeys',\n                exportJsonKey: { '@bit': { heading: { forKeys: '$' } } },\n              },\n              {\n                key: ConfigKey.resource_image,\n                description: 'Image resource for the match pair.',\n                jsonKey: 'keyImage',\n                exportJsonKey: { keyImage: '$' },\n              },\n            ],\n          },\n        ],\n      },\n      {\n        name: 'values',\n        repeat: true,\n        variants: [\n          {\n            jsonKey: 'values[]',\n            exportJsonKey: { values: ['$'] },\n            format: TextFormat.plainText,\n            tags: [\n              {\n                // PLAN-084: value-side excludes item/lead/pageNumber/marginNumber.\n                key: ConfigKey.group_standardTagsNoItemLead,\n                description: 'Standard tags for the image match pair (values side, no item/lead).',\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the image match pair.',\n                format: TagFormat.plainText,\n                nullable: true,\n                jsonKey: '^heading.forValues',\n                exportJsonKey: { '@bit': { heading: { forValues: '$' } } },\n              },\n              {\n                key: ConfigKey.resource_image,\n                description: 'Image resource for the match pair.',\n              },\n            ],\n            repeatCount: Count.infinity,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // match-matrix\n  //\n  [CardSetConfigKey.matchMatrix]: {\n    jsonKey: 'matrix',\n    exportJsonKey: { matrix: '$' },\n    sides: [\n      {\n        name: 'key',\n        variants: [\n          {\n            jsonKey: 'key',\n            exportJsonKey: { key: '$' },\n            format: TextFormat.plainText,\n            tags: [\n              {\n                key: ConfigKey.group_standardItemLeadInstructionHint,\n                description: 'Standard tags for lead, instruction, and hint.',\n              },\n              {\n                // PLAN-076: drop `example: '$'` from valued rule — pair-key\n                // `[@example:V]` is consumed as the per-pair cascade source.\n                // PLAN-077 R14 follow-up: investigation showed the fixture\n                // reference is INCONSISTENT — bits without a cardset-level\n                // cascade (e.g. bit 3 `[@example:Y]should be...`) expect\n                // pair-level `example: V` at pair scope, but bits WITH a\n                // cardset cascade (e.g. bit 8 `[@example:99]` in title-row\n                // PLUS pair-key `[@example:Y]`) expect NO pair-level\n                // example. Emitting `example: $` here satisfies bit 3 but\n                // breaks bit 8; dropping it satisfies bit 8 but breaks bit\n                // 3. Conditional emission would require runtime gating on\n                // the cardset cascade scope state. Left dropped pending a\n                // dedicated plan — accepted divergence on bit 3's pair-\n                // level emission (cells still get the per-cell `example`\n                // correctly via PLAN-077 §4.2 + §4.3).\n                key: ConfigKey.property_example,\n                exportJsonKey: [\n                  {\n                    '@keyonly': {\n                      isExample: true,\n                      '@bit': { isExample: true },\n                      '@card': { isExample: true },\n                    },\n                  },\n                  {\n                    '@absent': {\n                      isExample: true,\n                      '@bit': { isExample: true },\n                      '@card': { isExample: true },\n                    },\n                  },\n                  { isExample: true, '@bit': { isExample: true }, '@card': { isExample: true } },\n                ],\n                description: 'Example text for the match matrix.',\n                format: TagFormat.plainText,\n                nullable: true,\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the match matrix.',\n                format: TagFormat.plainText,\n                nullable: true,\n                jsonKey: '^heading.forKeys',\n                exportJsonKey: { '@bit': { heading: { forKeys: '$' } } },\n              },\n              {\n                // Axis-side `[@isCaseSensitive]` is a cascade SOURCE\n                // only: it must fire (so value-side cells inherit via\n                // `$ancestor`) but emit nothing itself — emission is\n                // owned by the value-side's cell-nested rule\n                // (`cells[$s].isCaseSensitive`, PLAN-122). The earlier\n                // flat `$ancestor` rule here double-emitted at bit\n                // scope and broke the `optimize(fullize(x)) ==\n                // optimize(x)` law on match-matrix.\n                key: ConfigKey.property_isCaseSensitive,\n                exportJsonKey: {},\n                description: 'Property to indicate if the match is case sensitive.',\n                format: TagFormat.boolean,\n              },\n            ],\n          },\n        ],\n      },\n      {\n        name: 'cell',\n        repeat: true,\n        variants: [\n          {\n            jsonKey: 'cells[{s}].values[]',\n            exportJsonKey: [\n              // PLAN-085 / R14: the positional-blank emission for an\n              // effectively-absent cell side fires ONLY when the active\n              // card has at least one `[#]` variant fire. This matches\n              // BPG `extractHeadingCard`'s `isHeading` gate: when no\n              // `[#]` exists anywhere in the title card, BPG returns\n              // undefined and no `heading` is emitted. The phantom\n              // `forValues:['']` placeholder is appropriate only when\n              // the card is being treated as a title-row.\n              {\n                predicates: ['@absent', { '@variantHasTag': '#' }],\n                rule: { '@bit': { heading: { forValues: [''] } } },\n              },\n              { cells: { $s: { values: ['$'] } } },\n            ],\n            format: TextFormat.plainText,\n            tags: [\n              {\n                key: ConfigKey.group_standardItemLeadInstructionHint,\n                description: 'Standard tags for lead, instruction, and hint.',\n              },\n              {\n                // PLAN-075: bare `$parent` reads the parent variant fire's\n                // source `$` value (the current `++`-iteration's cell text).\n                // Replaces `$parent.values[0]` which pinned to position 0\n                // regardless of which `++`-value `[@example]` was on.\n                //\n                // PLAN-077: dual `[@absent, { '$cascade': '*' }]` rule\n                // routes pair-key `[@example:V]` (a per-pair cascade\n                // source, bound via per-card CascadeCounters scope) and\n                // bit-header `[@example:V]` (cardset cascade) into the\n                // per-cell `example` via `$cascade`. The aggregator in\n                // `populate_variants` fires this rule ONCE per cell (BPG\n                // `parseMatchMatrix` `exampleSide` precedence), avoiding\n                // per-iter pollution.\n                // @card scope-shift writes matrix-row container isExample.\n                key: ConfigKey.property_example,\n                exportJsonKey: [\n                  {\n                    '@keyonly': {\n                      cells: { $s: { isExample: true, example: '$parent' } },\n                      '@bit': { isExample: true },\n                      '@card': { isExample: true },\n                    },\n                  },\n                  {\n                    predicates: ['@absent', { $cascade: '*' }],\n                    rule: {\n                      cells: { $s: { isExample: true, example: '$cascade' } },\n                      '@bit': { isExample: true },\n                      '@card': { isExample: true },\n                    },\n                  },\n                  {\n                    '@absent': {\n                      cells: { $s: { isExample: true, example: '$parent' } },\n                      '@bit': { isExample: true },\n                      '@card': { isExample: true },\n                    },\n                  },\n                  {\n                    cells: { $s: { isExample: true, example: '$' } },\n                    '@bit': { isExample: true },\n                    '@card': { isExample: true },\n                  },\n                ],\n                description: 'Example text for the match matrix.',\n                format: TagFormat.bitmarkText,\n                nullable: true,\n              },\n              {\n                // PLAN-085 / R14: bare `[#]` on a value-side emits the\n                // empty-string positional blank into `forValues` so the\n                // array stays aligned with the cell positions (matches BPG\n                // `extractHeadingCard`'s \"all value-side headings present\"\n                // shape). The `@keyonly` rule is required for two reasons:\n                // 1) it provides an emission for bare `[#]` (the `$` sigil\n                //    in the unconditional rule has no source for bare); and\n                // 2) the presence of any `@keyonly` rule disables the\n                //    optimised-mode `should_suppress_outcome` strip (see\n                //    `forward_emit.rs`) so the resulting `forValues: [\"\"]`\n                //    survives the all-natural-defaults check.\n                key: ConfigKey.tag_title,\n                description: 'Title of the match matrix.',\n                format: TagFormat.plainText,\n                nullable: true,\n                jsonKey: '^heading.forValues',\n                exportJsonKey: [\n                  { '@keyonly': { '@bit': { heading: { forValues: [''] } } } },\n                  { '@bit': { heading: { forValues: ['$'] } } },\n                ],\n              },\n              {\n                // matchMatrix cells are NESTED (`cells[$s]`), unlike matchPairs'\n                // flat pair object — so `isCaseSensitive` must be written INTO the\n                // cell, mirroring the sibling `example` rule above (`cells: { $s:\n                // {...} }`). The earlier flat `{ isCaseSensitive: '$' }` (copied\n                // from matchPairs) wrote at bit scope, so an authored cell-side\n                // `[@isCaseSensitive:false]` (e.g. on a `++` value) was dropped\n                // instead of landing on the cell. PLAN-122.\n                key: ConfigKey.property_isCaseSensitive,\n                exportJsonKey: [\n                  { '@absent': { cells: { $s: { isCaseSensitive: '$ancestor' } } } },\n                  { cells: { $s: { isCaseSensitive: '$' } } },\n                ],\n                description: 'Property to indicate if the match is case sensitive.',\n                format: TagFormat.boolean,\n              },\n            ],\n            repeatCount: Count.infinity,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // statements\n  //\n  [CardSetConfigKey.statements]: {\n    jsonKey: 'statements',\n    exportJsonKey: { statements: '$' },\n    sides: [\n      {\n        name: 'statement',\n        variants: [\n          {\n            jsonKey: 'statement',\n            exportJsonKey: { statement: '$' },\n            tags: [\n              {\n                key: ConfigKey.tag_true,\n                description: 'Tag for true statements.',\n                jsonKey: 'statement|set(isCorrect=true)',\n                exportJsonKey: { statement: '$', isCorrect: true },\n                maxCount: 1,\n              },\n              {\n                key: ConfigKey.tag_false,\n                description: 'Tag for false statements.',\n                jsonKey: 'statement|set(isCorrect=false)',\n                exportJsonKey: { statement: '$', isCorrect: false },\n                maxCount: 1,\n              },\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the statement.',\n              },\n              {\n                // PLAN-072: cascade-fired `@example` from the bit header\n                // fills each statement entry's `example` with the entry's\n                // own `isCorrect`, mirroring BPG's `pushExampleDownTree`\n                // for the statements cardset. Per-array-item strip removes\n                // `example: false` from incorrect entries so only correct\n                // entries retain `example: true`.\n                key: ConfigKey.property_example,\n                exportJsonKey: [\n                  {\n                    '@keyonly': {\n                      isExample: true,\n                      example: true,\n                      '@bit': { isExample: true },\n                    },\n                  },\n                  {\n                    '@absent': {\n                      isExample: true,\n                      example: '$parent.isCorrect',\n                      '@bit': { isExample: true },\n                    },\n                  },\n                  { isExample: true, example: '$', '@bit': { isExample: true } },\n                ],\n                description:\n                  'Example marker on the statement. Bare `[@example]` emits the boolean marker; valued `[@example:true|false]` emits the literal value. Cascade from bit-header fills `example` with the entry’s own `isCorrect`.',\n                format: TagFormat.boolean,\n                nullable: true,\n              },\n            ],\n            bodyAllowed: false,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // quiz\n  //\n  [CardSetConfigKey.quiz]: {\n    jsonKey: 'quizzes',\n    exportJsonKey: { quizzes: '$' },\n    sides: [\n      {\n        name: 'choices',\n        variants: [\n          {\n            jsonKey: null,\n            tags: [\n              {\n                key: ConfigKey.group_trueFalse,\n                description: 'Group for true/false questions.',\n              },\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the quiz.',\n              },\n              {\n                // ALIGN-EXAMPLE-CASCADE §3.2: variant-level cascade for\n                // quiz choices is delegated to group_trueFalse's\n                // chain-child `@example` (`+` chain with maxEmits:1 +\n                // `@parent.isCorrect=true`). Variant-level `@absent`\n                // would over-fire on subsequent correct choices and on\n                // incorrect ones — drop it.\n                key: ConfigKey.property_example,\n                exportJsonKey: [\n                  { '@keyonly': { isExample: true, '@bit': { isExample: true } } },\n                  { isExample: true, '@bit': { isExample: true } },\n                ],\n                description:\n                  'Example marker on the quiz choice (entry-local only; cascade handled by group_trueFalse chain-children).',\n                format: TagFormat.boolean,\n                nullable: true,\n              },\n            ],\n            bodyAllowed: false,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // quiz (responses)\n  //\n  [CardSetConfigKey.quizResponses]: {\n    jsonKey: 'quizzes',\n    exportJsonKey: { quizzes: '$' },\n    sides: [\n      {\n        name: 'responses',\n        variants: [\n          {\n            jsonKey: null,\n            tags: [\n              {\n                key: ConfigKey.group_trueFalseResponses,\n                description: 'Group for true/false questions.',\n              },\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the quiz.',\n              },\n              {\n                // PLAN-072: cascade-fired `@example` from the bit header\n                // fills each response entry's `example` with the entry's\n                // own `isCorrect`, mirroring BPG's `pushExampleDownTree`\n                // for the quiz-responses cardset (statements-style).\n                key: ConfigKey.property_example,\n                exportJsonKey: [\n                  { '@keyonly': { isExample: true, '@bit': { isExample: true } } },\n                  {\n                    '@absent': {\n                      isExample: true,\n                      example: '$parent.isCorrect',\n                      '@bit': { isExample: true },\n                    },\n                  },\n                  { isExample: true, '@bit': { isExample: true } },\n                ],\n                description:\n                  'Example marker on the quiz response; cascade from bit-header fills `example` with the entry’s own `isCorrect`.',\n                format: TagFormat.boolean,\n                nullable: true,\n              },\n            ],\n            bodyAllowed: false,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // feedback\n  //\n  [CardSetConfigKey.feedback]: {\n    jsonKey: 'feedbacks',\n    exportJsonKey: { feedbacks: '$' },\n    sides: [\n      {\n        name: 'choices',\n        variants: [\n          {\n            jsonKey: null,\n            tags: [\n              {\n                key: ConfigKey.group_standardItemLeadInstructionHint,\n                description: 'Standard tags for lead, instruction, and hint.',\n              },\n              {\n                // Feedback choices: `[+]` / `[-]` map to choice + `requireReason`\n                // (NOT `isCorrect` like trueFalse). Shadow the inherited\n                // `tag_true` / `tag_false` from `group_trueFalse` to emit the\n                // feedback-specific shape.\n                //\n                // Chain @example: `[+ X][@example]` writes\n                // `isExample/example` onto the X choice only. BPG's\n                // `setIsExampleFlags` (Builder.ts:4041-4172) does NOT\n                // iterate `cardNode.feedbacks` — so unlike multipleChoice,\n                // there is no bubble to bit-level or feedbacks-level\n                // isExample. Pattern omits `@bit` scope-shift accordingly.\n                // No `@absent`/`@parent.isCorrect` cascade rules either:\n                // BPG's `pushExampleDownTree` (Builder.ts:3777-3849) has\n                // no feedback dispatch, so bit-header `[@example]` does\n                // not flow into feedback choices.\n                key: ConfigKey.tag_true,\n                exportJsonKey: { choices: [{ choice: '$', requireReason: true }] },\n                description: 'Reason-required choice for feedback (`[+]`).',\n                maxCount: Count.infinity,\n                format: TagFormat.plainText,\n                chain: [\n                  {\n                    key: ConfigKey.property_example,\n                    exportJsonKey: [\n                      { '@keyonly': { isExample: true, example: true } },\n                      { isExample: true, example: '$' },\n                    ],\n                    description: 'Per-choice example marker for feedback `[+]`.',\n                    format: TagFormat.boolean,\n                    maxCount: 1,\n                    nullable: true,\n                  },\n                  {\n                    // `[+ X][! foo]` chains `!` (instruction) onto the\n                    // choice; same for `[?]` (hint), `[%]` (item),\n                    // `[%2]`/`[%3]`/`[%4]` (lead/pageNumber/marginNumber).\n                    // Mirrors group_trueFalse's `+` chain shape.\n                    key: ConfigKey.group_standardItemLeadInstructionHint,\n                    description:\n                      'Item, lead, page number, margin number, instruction and hint chained onto the feedback choice.',\n                  },\n                ],\n              },\n              {\n                key: ConfigKey.tag_false,\n                exportJsonKey: { choices: [{ choice: '$', requireReason: false }] },\n                description: 'Reason-not-required choice for feedback (`[-]`).',\n                maxCount: Count.infinity,\n                format: TagFormat.plainText,\n                chain: [\n                  {\n                    key: ConfigKey.property_example,\n                    exportJsonKey: [\n                      { '@keyonly': { isExample: true, example: true } },\n                      { isExample: true, example: '$' },\n                    ],\n                    description: 'Per-choice example marker for feedback `[-]`.',\n                    format: TagFormat.boolean,\n                    maxCount: 1,\n                    nullable: true,\n                  },\n                  {\n                    key: ConfigKey.group_standardItemLeadInstructionHint,\n                    description:\n                      'Item, lead, page number, margin number, instruction and hint chained onto the feedback choice.',\n                  },\n                ],\n              },\n              {\n                key: ConfigKey.group_trueFalse,\n                description: 'Group for true/false feedback.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the feedback.',\n                format: TagFormat.plainText,\n                nullable: true,\n                jsonKey: '^heading.forKeys',\n                exportJsonKey: { '@bit': { heading: { forKeys: '$' } } },\n              },\n            ],\n            bodyAllowed: false,\n          },\n        ],\n      },\n      {\n        name: 'reason',\n        variants: [\n          {\n            // PLAN: feedback.reason — Object-only variant pattern. Per\n            // SYNTAX.md §8.1, sibling tag emissions do NOT auto-wrap\n            // under `reason.*`; each tag here spells out the full path.\n            // Body is a plain string (BPG `parseFeedback` uses\n            // `cardBodyStr ?? ''` for `reason.text`).\n            jsonKey: 'reason.text',\n            exportJsonKey: { reason: { text: '$' } },\n            format: TextFormat.plainText,\n            tags: [\n              {\n                // Instruction lands under reason. Hint/item/lead/etc.\n                // omitted: not exercised by any fixture and BPG's\n                // `parseFeedback` spreads only the tags actually present\n                // — adding the rest can be done lazily as fixtures\n                // require them, with the same `{reason: {…}}` wrapper.\n                key: ConfigKey.tag_instruction,\n                exportJsonKey: { reason: { instruction: '$' } },\n                description: 'Instruction for the feedback reason.',\n                format: TagFormat.bitmarkText,\n              },\n              {\n                key: ConfigKey.property_reasonableNumOfChars,\n                exportJsonKey: [\n                  { '@absent': { reason: { reasonableNumOfChars: '$ancestor' } } },\n                  { reason: { reasonableNumOfChars: '$' } },\n                ],\n                description: 'Property for reasonable number of characters.',\n                format: TagFormat.number,\n              },\n              {\n                // ALIGN-EXAMPLE-CASCADE §3.9: `feedback.reason` is NOT in\n                // BPG's `pushExampleDownTree` dispatch — no bit-header\n                // cascade. Local emission only.\n                //\n                // Both `reason.example` and `feedbacks[].example` are\n                // `TextAst` per BPG's schema — paragraph arrays. Format\n                // here is `bitmarkText` so `$` coerces to a paragraph\n                // array at both write sites.\n                key: ConfigKey.property_example,\n                exportJsonKey: [\n                  {\n                    // Bare `[@example]`: reason.example is TextAst — BPG\n                    // coerces the boolean default to a paragraph\n                    // containing the string \"true\". feedbacks[].example\n                    // is not TextAst, stays a boolean. Two literal writes.\n                    '@keyonly': {\n                      reason: {\n                        isExample: true,\n                        example: [{ type: 'paragraph', content: [{ text: 'true', type: 'text' }] }],\n                      },\n                      isExample: true,\n                      example: true,\n                      '@bit': { isExample: true },\n                    },\n                  },\n                  {\n                    reason: { isExample: true, example: '$' },\n                    isExample: true,\n                    example: '$',\n                    '@bit': { isExample: true },\n                  },\n                ],\n                description:\n                  'Example text for the feedback reason (entry-local only; no bit-header cascade).',\n                format: TagFormat.bitmarkText,\n                nullable: true,\n              },\n              {\n                key: ConfigKey.tag_title,\n                description: 'Title of the feedback.',\n                format: TagFormat.plainText,\n                nullable: true,\n                jsonKey: '^heading.forValues',\n                exportJsonKey: { '@bit': { heading: { forValues: '$' } } },\n              },\n            ],\n            bodyAllowed: true,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // questions\n  //\n  [CardSetConfigKey.questions]: {\n    jsonKey: 'questions',\n    exportJsonKey: { questions: '$' },\n    sides: [\n      {\n        name: 'question',\n        variants: [\n          {\n            jsonKey: 'question',\n            exportJsonKey: { question: '$' },\n            tags: [\n              {\n                key: ConfigKey.property_reasonableNumOfChars,\n                exportJsonKey: [\n                  { '@absent': { reasonableNumOfChars: '$ancestor' } },\n                  { reasonableNumOfChars: '$' },\n                ],\n                description: 'Property for reasonable number of characters.',\n                format: TagFormat.number,\n              },\n              {\n                exportJsonKey: { sampleSolution: '$' },\n                key: ConfigKey.tag_sampleSolution,\n                description: 'Sample solution for the question.',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.property_sampleSolution,\n                description: 'Property for sample solution text.',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.property_additionalSolutions,\n                description: 'Property for additional solutions.',\n                format: TagFormat.plainText,\n                maxCount: Count.infinity,\n              },\n              {\n                key: ConfigKey.property_partialAnswer,\n                description: 'Property for partial answer text.',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for the question.',\n              },\n              {\n                // ALIGN-EXAMPLE-CASCADE §3.10: `questions` is NOT in BPG's\n                // `pushExampleDownTree` dispatch — bit-header `[@example]`\n                // does not propagate `example`/`isExample` onto question\n                // entries. Only entry-local `[@example]` fires.\n                //\n                // BPG's `BaseBuilder.toExample` for interview questions\n                // (Builder.ts:2575,2588) uses `data.__sampleSolutionAst`\n                // as `defaultExample` — bare `[@example]` (which sets\n                // `__isDefaultExample=true, example=undefined`) emits the\n                // parsed sample-solution AST in the `example` slot. The\n                // `@keyonly` rule mirrors that runtime behaviour via\n                // `$parent.sampleSolution` — the chain-walker's post-walk\n                // retry resolves this once the sibling `[@sampleSolution]`\n                // chain has merged into the shared scope (interview's\n                // `[@example]` typically precedes `[@sampleSolution]` in\n                // source). Format coercion turns the resolved string\n                // value into a PM tree.\n                key: ConfigKey.property_example,\n                exportJsonKey: [\n                  {\n                    '@keyonly': {\n                      isExample: true,\n                      example: '$parent.sampleSolution',\n                      '@bit': { isExample: true },\n                    },\n                  },\n                  { isExample: true, example: '$', '@bit': { isExample: true } },\n                ],\n                description:\n                  'Example marker for the question (entry-local only; no bit-header cascade).',\n                format: TagFormat.bitmarkText,\n                nullable: true,\n              },\n            ],\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // elements\n  //\n  [CardSetConfigKey.elements]: {\n    jsonKey: null,\n    sides: [\n      {\n        name: 'element',\n        repeat: true,\n        variants: [\n          {\n            jsonKey: 'elements[]',\n            exportJsonKey: { elements: ['$'] },\n            tags: [\n              {\n                key: ConfigKey.group_standardItemLeadInstructionHint,\n                description: 'Standard tags for lead, instruction, and hint.',\n              },\n              {\n                // ALIGN-EXAMPLE-CASCADE §3.11: `elements` is NOT in BPG's\n                // `pushExampleDownTree` dispatch — no bit-header cascade.\n                key: ConfigKey.property_example,\n                exportJsonKey: [\n                  { '@keyonly': { isExample: true, example: true, '@bit': { isExample: true } } },\n                  { isExample: true, example: '$', '@bit': { isExample: true } },\n                ],\n                description:\n                  'Example text for the element (entry-local only; no bit-header cascade).',\n                format: TagFormat.plainText,\n                nullable: true,\n              },\n            ],\n            repeatCount: Count.infinity,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // table\n  //\n  // PLAN-079: supports BOTH source formats and collapses to the same basic\n  // output (`{ columns?, data, columnWidths? }`):\n  //\n  // 1. Basic format — first card carries `[#X]` markers (fire `tag_title`\n  //    → `^table.columns[]`); subsequent cards are body rows. Cards have\n  //    no qualifier, so they route to the `table-body` (default) section.\n  //\n  // 2. Extended format — `==== table-header ====` / `==== table-footer ====`\n  //    qualifiers. The `table-header` section uses `@cardIndex=0` to route\n  //    the first header card's cells to `columns` and demote remaining\n  //    header cards (rows) into `data`. Per-cell `[@tableRowSpan]` /\n  //    `[@tableScope]` / `[@tableCellType]` tags are valid-but-unmapped\n  //    here (no per-cell metadata in basic shape) — declared on the cell\n  //    variant below.\n  //\n  [CardSetConfigKey.table]: {\n    jsonKey: null,\n    exportJsonKey: null,\n    // PLAN-109 / HTML.md §8 — idiomatic HTML mapping. The classic (non-extended)\n    // table produces the same `<table>`/`<thead>`/`<tbody>`/`<tfoot>` structure as\n    // table-extended, so the structural htmlKeys mirror that cardSet. NOTE: the\n    // JSON side routes the FIRST header card → `columns` (header) and SUBSEQUENT\n    // header cards → `data` (body); HTML uses a uniform `<thead>` for the whole\n    // `table-header` section, so a multi-card header (e.g. a second header card\n    // that JSON sends to `data`) renders as additional `<thead>` rows rather than\n    // moving to `<tbody>`. Per-card header/body splitting needs engine-level\n    // routing not yet expressible in the pattern vocabulary — see PLAN-109.\n    htmlKey: { '@el': 'table', '@children': '$' },\n    sections: {\n      'table-header': {\n        // First header card's row of cells → `columns`. Subsequent header\n        // cards' rows → `data` (per-card append; `[$]` shape because\n        // per-card emission fires once per card, multiple fires deep_merge-\n        // append). PLAN-079 + PLAN-080: predicates inside exportJsonKey\n        // both ROUTE cards to this section (when no explicit `==== table-\n        // header ====` qualifier) and SELECT the rule body once routed.\n        // First rule = first card with any `[#]` → `columns`; second rule\n        // = subsequent cards in this section → `data` (per-row append).\n        jsonKey: 'table.columns',\n        exportJsonKey: [\n          {\n            predicates: [{ '@cardIndex': 0 }, { '@variantHasTag': '#' }],\n            rule: { '@bit': { table: { columns: '$' } } },\n          },\n          { '@cardIndex=0': { '@bit': { table: { columns: '$' } } } },\n          { '@bit': { table: { data: ['$'] } } },\n        ],\n        // Header section → `<thead>` rows of `<th>`; `@tableColWidth` bubbles a\n        // `width` attr onto the enclosing `<th>` (HTML-C2).\n        htmlKey: { '@el': 'thead', '@children': { '@el': 'tr', '@children': '$' } },\n        sideHtmlKey: { '@el': 'th', '@children': '$' },\n      },\n      'table-body': {\n        // Batched emission: `$` is the entire 2D array of body card rows.\n        // This is the default section (no qualifier → cards land here).\n        jsonKey: 'table.data',\n        exportJsonKey: { '@bit': { table: { data: '$' } } },\n        htmlKey: { '@el': 'tbody', '@children': { '@el': 'tr', '@children': '$' } },\n        isDefault: true,\n      },\n      'table-footer': {\n        // Batched emission: `$` is the entire 2D array of footer rows.\n        jsonKey: 'table.data',\n        exportJsonKey: { '@bit': { table: { data: '$' } } },\n        // Footer cells route to `data` (not `columns`), so they are `<td>` (no\n        // sideHtmlKey override — the cell side default applies).\n        htmlKey: { '@el': 'tfoot', '@children': { '@el': 'tr', '@children': '$' } },\n      },\n    },\n    sides: [\n      {\n        name: 'cell',\n        repeat: true,\n        // Default (body/footer) cell → `<td>`; the header section overrides to\n        // `<th>` via its sideHtmlKey (HTML.md §8).\n        htmlKey: { '@el': 'td', '@children': '$' },\n        variants: [\n          {\n            jsonKey: null,\n            tags: [\n              {\n                key: ConfigKey.group_standardItemLeadInstructionHint,\n                description: 'Standard tags for lead, instruction, and hint.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                jsonKey: '^table.columns[]',\n                exportJsonKey: { '@bit': { table: { columns: ['$'] } } },\n                description: 'Title of the table.',\n              },\n              {\n                key: ConfigKey.property_tableCellType,\n                // HTML.md §8: first-match predicate selecting `<th>` vs `<td>`.\n                htmlKey: [{ '@value=th': { '@el': 'th' } }, { '@absent': { '@el': 'td' } }],\n                description: 'Table cell type (th/td).',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.property_tableRowSpan,\n                // HTML-C2: contribute a `rowspan` attribute onto the enclosing\n                // cell element (`<th>`/`<td>`).\n                htmlKey: { '@el': { '@attr': { rowspan: '$' } } },\n                description: 'Number of rows the cell spans.',\n                format: TagFormat.number,\n              },\n              {\n                key: ConfigKey.property_tableColSpan,\n                // HTML-C2: contribute a `colspan` attribute onto the enclosing\n                // cell element (`<th>`/`<td>`).\n                htmlKey: { '@el': { '@attr': { colspan: '$' } } },\n                description: 'Number of columns the cell spans.',\n                format: TagFormat.number,\n              },\n              {\n                key: ConfigKey.property_tableScope,\n                // HTML-C2: contribute a `scope` attribute onto the enclosing\n                // cell element (`<th>`/`<td>`).\n                htmlKey: { '@el': { '@attr': { scope: '$' } } },\n                description: 'Scope attribute for header cells.',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.property_tableColWidth,\n                jsonKey: '^table.columnWidths[{s}]',\n                exportJsonKey: { '@bit': { table: { columnWidths: { $s: '$' } } } },\n                // HTML.md §8 + HTML-C2: contribute a `width` attribute onto the\n                // enclosing cell element (`<th>`/`<td>`).\n                htmlKey: { '@el': { '@attr': { width: '$' } } },\n                description: 'Width for the column.',\n                format: TagFormat.number,\n              },\n            ],\n            repeatCount: Count.infinity,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // table-extended\n  //\n  [CardSetConfigKey.tableExtended]: {\n    jsonKey: null,\n    // PLAN-109 / HTML.md §8 — idiomatic HTML mapping for the extended table.\n    // The card-set container is the `<table>` element; each section is a\n    // table section element (`<thead>`/`<tbody>`/`<tfoot>`) whose children are\n    // `<tr>` rows, and each cell side is a `<td>` (body) or `<th>` (header /\n    // footer, via the section sideHtmlKey override).\n    htmlKey: { '@el': 'table', '@children': '$' },\n    sections: {\n      'table-header': {\n        jsonKey: 'table.header.rows',\n        // PLAN-080: section dispatch via predicates inside exportJsonKey.\n        // Cards with no explicit `==== table-header ====` qualifier\n        // route here if FIRST CARD contains any `[#]` tag in any\n        // variant. Explicit-qualifier cards fall through to the\n        // unconditional fallback rule. Both rules use the per-card\n        // append shape `rows: ['$']` — the runtime triggers per-card\n        // emission whenever the pattern carries predicates, and each\n        // fire appends a single-element array (multi-fire deep-merge\n        // concatenates).\n        exportJsonKey: [\n          {\n            predicates: [{ '@cardIndex': 0 }, { '@variantHasTag': '#' }],\n            rule: { table: { header: { rows: ['$'] } } },\n          },\n          { table: { header: { rows: ['$'] } } },\n        ],\n        htmlKey: { '@el': 'thead', '@children': { '@el': 'tr', '@children': '$' } },\n        // PLAN-141 F2 (NISO import): the XHTML table model NISO uses — a\n        // <thead> SECTION whose <tr> rows are the header cards.\n        mappingKeys: {\n          'xml-niso-iec': { '@el': 'thead', '@children': { '@el': 'tr', '@children': '$' } },\n        },\n        sideJsonKey: 'cells[{s}]|set(title=true)',\n        sideExportJsonKey: { cells: { $s: { title: true, $: '$' } } },\n        // Header cells are `<th>`. The `width` attribute is contributed by the\n        // `@tableColWidth` tag, which bubbles it onto the enclosing `<th>`\n        // (HTML-C2) — so it is not repeated here.\n        sideHtmlKey: { '@el': 'th', '@children': '$' },\n      },\n      'table-body': {\n        jsonKey: 'table.body.rows',\n        exportJsonKey: { table: { body: { rows: '$' } } },\n        htmlKey: { '@el': 'tbody', '@children': { '@el': 'tr', '@children': '$' } },\n        // PLAN-141 F2 (NISO import): <tbody> rows are the (default) data cards.\n        mappingKeys: {\n          'xml-niso-iec': { '@el': 'tbody', '@children': { '@el': 'tr', '@children': '$' } },\n        },\n        isDefault: true,\n      },\n      'table-footer': {\n        jsonKey: 'table.footer.rows',\n        exportJsonKey: { table: { footer: { rows: '$' } } },\n        htmlKey: { '@el': 'tfoot', '@children': { '@el': 'tr', '@children': '$' } },\n        // PLAN-141 F2 (NISO import): NISO has no <tfoot> — the footer card's\n        // source is the <table-wrap-foot> block (CONTENT-shaped: no rows; its\n        // prose/notes flatten into one footer card — catalog table-wrap-foot\n        // row; a contained <def-list> promotes as a sibling legend bit).\n        mappingKeys: { 'xml-niso-iec': { '@el': 'table-wrap-foot', '@children': '$' } },\n        sideJsonKey: 'cells[{s}]|set(title=true)',\n        sideExportJsonKey: { cells: { $s: { title: true, $: '$' } } },\n        // Footer cells render as `<th>` (mirrors the header `title: true`\n        // mapping); §8 lists only the header side, so this parallels it.\n        sideHtmlKey: { '@el': 'th', '@children': '$' },\n      },\n    },\n    sides: [\n      {\n        name: 'cell',\n        repeat: true,\n        jsonKey: 'cells[{s}]',\n        exportJsonKey: { cells: { $s: '$' } },\n        // Default (body) cell → `<td>`; the header/footer sections override the\n        // side to `<th>` via their sideHtmlKey (HTML.md §8).\n        htmlKey: { '@el': 'td', '@children': '$' },\n        // PLAN-141 F2 (NISO import): a <td> row child is a body cell side.\n        mappingKeys: { 'xml-niso-iec': { '@el': 'td', '@children': '$' } },\n        variants: [\n          {\n            jsonKey: 'content',\n            exportJsonKey: { content: '$' },\n            tags: [\n              {\n                key: ConfigKey.group_standardItemLeadInstructionHint,\n                description: 'Standard tags for lead, instruction, and hint.',\n              },\n              {\n                key: ConfigKey.tag_title,\n                // PLAN-080: the `[#]` tag writes its text to the cell's\n                // `content` field. When the card is in the `table-header`\n                // section, the section's sideExportJsonKey wraps each\n                // cell with `title: true` automatically.\n                jsonKey: 'content',\n                exportJsonKey: { content: '$' },\n                description: 'Title text of the table cell (header rows).',\n                // PLAN-141 F2 (NISO import): a <th> row child is a TITLE cell —\n                // its content lands in the `[#…]` tag (an empty <th> keeps its\n                // slot as a bare `[#]`).\n                mappingKeys: { 'xml-niso-iec': { '@el': 'th', '@children': '$' } },\n              },\n              {\n                key: ConfigKey.property_tableCellType,\n                jsonKey: 'title|bool(th)',\n                exportJsonKey: [{ '@value=th': { title: true } }],\n                // HTML.md §8: same first-match predicate machinery selecting\n                // `<th>` vs `<td>` instead of `title:true` vs nothing.\n                htmlKey: [{ '@value=th': { '@el': 'th' } }, { '@absent': { '@el': 'td' } }],\n                description: 'Table cell type (th/td).',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.property_tableRowSpan,\n                jsonKey: 'rowspan',\n                exportJsonKey: { rowspan: '$' },\n                // HTML-C2: contribute a `rowspan` attribute onto the enclosing\n                // cell element (`<th>`/`<td>`).\n                htmlKey: { '@el': { '@attr': { rowspan: '$' } } },\n                // PLAN-141 F2 (NISO import): recover the source cell's own\n                // `rowspan` attribute (element-scope attr form).\n                mappingKeys: { 'xml-niso-iec': { '@el': { '@attr': { rowspan: '$' } } } },\n                description: 'Number of rows the cell spans.',\n                format: TagFormat.number,\n              },\n              {\n                key: ConfigKey.property_tableColSpan,\n                jsonKey: 'colspan',\n                exportJsonKey: { colspan: '$' },\n                // HTML-C2: contribute a `colspan` attribute onto the enclosing\n                // cell element (`<th>`/`<td>`).\n                htmlKey: { '@el': { '@attr': { colspan: '$' } } },\n                // PLAN-141 F2 (NISO import): recover the source cell's own\n                // `colspan` attribute (element-scope attr form).\n                mappingKeys: { 'xml-niso-iec': { '@el': { '@attr': { colspan: '$' } } } },\n                description: 'Number of columns the cell spans.',\n                format: TagFormat.number,\n              },\n              {\n                key: ConfigKey.property_tableScope,\n                jsonKey: 'scope',\n                exportJsonKey: { scope: '$' },\n                // HTML-C2: contribute a `scope` attribute onto the enclosing\n                // cell element (`<th>`/`<td>`).\n                htmlKey: { '@el': { '@attr': { scope: '$' } } },\n                description: 'Scope attribute for header cells.',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.property_tableColWidth,\n                // PLAN-080: write to the cell's `colwidth` field.\n                jsonKey: 'colwidth',\n                exportJsonKey: { colwidth: '$' },\n                // HTML.md §8 + HTML-C2: contribute a `width` attribute onto the\n                // enclosing cell element (`<th>`/`<td>`).\n                htmlKey: { '@el': { '@attr': { width: '$' } } },\n                // PLAN-141 F2 (NISO import): NISO carries widths as PER-COLUMN\n                // <col width=\"…\"> descriptors at container level, not on cells.\n                // The matched values distribute positionally onto the first\n                // (header) card's sides. Number format ⇒ only an integral\n                // percentage survives (\"20.0000%\" → 20); a fractional one\n                // (renderer-equalised \"4.7619%\") is dropped — catalog `col` row.\n                mappingKeys: { 'xml-niso-iec': { '@el': 'col', '@attr': { width: '$' } } },\n                description: 'Width for the column.',\n                format: TagFormat.number,\n              },\n            ],\n            repeatCount: Count.infinity,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // pronunciation-table\n  //\n  [CardSetConfigKey.pronunciationTable]: {\n    jsonKey: 'pronunciationTable.data',\n    exportJsonKey: { pronunciationTable: { data: '$' } },\n    sides: [\n      {\n        name: 'cell',\n        repeat: true,\n        variants: [\n          {\n            jsonKey: 'body',\n            exportJsonKey: { body: '$' },\n            tags: [\n              {\n                key: ConfigKey.group_standardItemLeadInstructionHint,\n                description: 'Standard tags for lead, instruction, and hint.',\n              },\n              {\n                exportJsonKey: { title: '$' },\n                key: ConfigKey.tag_title,\n                description: 'Title of the pronunciation table.',\n              },\n              {\n                key: ConfigKey.resource_audio,\n                description: 'Audio resource for the pronunciation table.',\n                jsonKey: 'audio',\n                exportJsonKey: { audio: { type: 'audio', audio: { src: '$' } } },\n              },\n            ],\n            repeatCount: Count.infinity,\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // bot-action-responses\n  //\n  [CardSetConfigKey.botActionResponses]: {\n    jsonKey: 'responses',\n    exportJsonKey: { responses: '$' },\n    sides: [\n      {\n        name: 'response',\n        variants: [\n          {\n            jsonKey: 'feedback',\n            exportJsonKey: { feedback: '$' },\n            format: TextFormat.plainText,\n            tags: [\n              {\n                key: ConfigKey.property_reaction,\n                description: 'Reaction to the bot action.',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.tag_item,\n                jsonKey: 'item',\n                exportJsonKey: { item: '$' },\n                format: TagFormat.plainText,\n                description: 'The item for the bit',\n                chain: [\n                  {\n                    key: ConfigKey.tag_item,\n                    jsonKey: 'lead',\n                    exportJsonKey: { lead: '$' },\n                    description: 'The lead for the bit',\n                    maxCount: 1,\n                    chain: [\n                      {\n                        key: ConfigKey.tag_item,\n                        jsonKey: 'pageNumber',\n                        exportJsonKey: { pageNumber: '$' },\n                        description: 'The page number for the bit',\n                        maxCount: 1,\n                        chain: [\n                          {\n                            key: ConfigKey.tag_item,\n                            jsonKey: 'marginNumber',\n                            exportJsonKey: { marginNumber: '$' },\n                            description: 'The margin number for the bit',\n                            maxCount: 1,\n                          },\n                        ],\n                      },\n                    ],\n                  },\n                ],\n              },\n              {\n                key: ConfigKey.tag_instruction,\n                description: 'The response label for the bot action.',\n                jsonKey: 'response',\n                exportJsonKey: { response: '$' },\n                format: TagFormat.plainText,\n              },\n              {\n                // ALIGN-EXAMPLE-CASCADE §3.12: `bot-action-responses` is\n                // NOT in BPG's `pushExampleDownTree` dispatch — no bit-\n                // header cascade.\n                key: ConfigKey.property_example,\n                exportJsonKey: [\n                  { '@keyonly': { isExample: true, example: true, '@bit': { isExample: true } } },\n                  { isExample: true, example: '$', '@bit': { isExample: true } },\n                ],\n                description:\n                  'Example text for the bot action response (entry-local only; no bit-header cascade).',\n                format: TagFormat.plainText,\n                nullable: true,\n              },\n            ],\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // cloze-list\n  //\n  [CardSetConfigKey.clozeList]: {\n    jsonKey: 'listItems',\n    exportJsonKey: { listItems: '$' },\n    sides: [\n      {\n        name: 'content',\n        variants: [\n          {\n            jsonKey: 'body',\n            exportJsonKey: { body: '$' },\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for cloze items.',\n              },\n              {\n                key: ConfigKey.group_gap,\n                description: 'Group for gap tags in cloze items.',\n              },\n            ],\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // example-bit-list\n  //\n  [CardSetConfigKey.exampleBitList]: {\n    jsonKey: 'listItems',\n    exportJsonKey: { listItems: '$' },\n    sides: [\n      {\n        name: 'item',\n        variants: [\n          {\n            jsonKey: 'body',\n            exportJsonKey: { body: '$' },\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for example bits.',\n              },\n              {\n                exportJsonKey: { title: '$' },\n                key: ConfigKey.tag_title,\n                description: 'Title of the example bit.',\n              },\n            ],\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // page-footer-sections — mirrors example-bit-list but emits cards under\n  // `sections` instead of `listItems`. BPG's JsonGenerator special-cases\n  // BitType.pageFooter in code; this dedicated cardSet expresses the same\n  // routing as pure config so the Rust serializer can pick it up.\n  //\n  [CardSetConfigKey.pageFooterSections]: {\n    jsonKey: 'sections',\n    exportJsonKey: { sections: '$' },\n    sides: [\n      {\n        name: 'item',\n        variants: [\n          {\n            jsonKey: 'body',\n            exportJsonKey: { body: '$' },\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for page-footer section bits.',\n              },\n              {\n                exportJsonKey: { title: '$' },\n                key: ConfigKey.tag_title,\n                description: 'Title of the page-footer section.',\n              },\n            ],\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // ingredients\n  //\n  [CardSetConfigKey.ingredients]: {\n    jsonKey: 'ingredients',\n    exportJsonKey: { ingredients: '$' },\n    sides: [\n      {\n        name: 'ingredient',\n        variants: [\n          {\n            jsonKey: 'ingredient',\n            exportJsonKey: { ingredient: '$' },\n            tags: [\n              {\n                exportJsonKey: { title: '$' },\n                key: ConfigKey.tag_title,\n                description: 'Title of the ingredient.',\n              },\n              {\n                key: ConfigKey.tag_true,\n                description: 'Checked state for the ingredient.',\n                jsonKey: '|set(checked=true)',\n                exportJsonKey: { checked: true, $: '$' },\n                maxCount: 1,\n                // nullable: true,\n              },\n              {\n                key: ConfigKey.tag_false,\n                description: 'Unchecked state for the ingredient.',\n                jsonKey: '|set(checked=false)',\n                exportJsonKey: { checked: false, $: '$' },\n                maxCount: 1,\n                // nullable: true,\n              },\n              {\n                key: ConfigKey.group_standardItemLead,\n                description: 'Item, lead, page number, and margin number for the ingredient.',\n              },\n              {\n                key: ConfigKey.tag_instruction,\n                description: 'The quantity of the ingredient.',\n                jsonKey: 'quantity',\n                exportJsonKey: { quantity: '$' },\n                format: TagFormat.number,\n              },\n              {\n                exportJsonKey: { hint: '$' },\n                key: ConfigKey.tag_hint,\n                description: 'The hint for the ingredient.',\n              },\n              {\n                key: ConfigKey.property_unit,\n                description: 'Unit of measurement for the ingredient (singular).',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.property_unitPlural,\n                description: 'Unit of measurement for the ingredient (plural).',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.property_unitAbbr,\n                description: 'Abbreviation for the unit of measurement (singular).',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.property_unitAbbrPlural,\n                description: 'Abbreviation for the unit of measurement (plural).',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.property_decimalPlaces,\n                description: 'Number of decimal places for the ingredient quantity.',\n                format: TagFormat.number,\n                defaultValue: '1',\n              },\n              {\n                key: ConfigKey.property_disableCalculation,\n                description: 'Disable calculation for the ingredient.',\n                format: TagFormat.boolean,\n              },\n            ],\n          },\n        ],\n      },\n    ],\n  },\n\n  //\n  // book-reference-list\n  //\n  [CardSetConfigKey.bookReferenceList]: {\n    jsonKey: 'bookReferences',\n    exportJsonKey: { bookReferences: '$' },\n    sides: [\n      {\n        name: 'reference',\n        variants: [\n          {\n            jsonKey: null,\n            tags: [\n              {\n                key: ConfigKey.group_standardTags,\n                description: 'Standard tags for book references.',\n              },\n              {\n                key: ConfigKey.property_refAuthor,\n                description: 'Author of the book.',\n                format: TagFormat.plainText,\n                maxCount: Count.infinity,\n              },\n              {\n                key: ConfigKey.property_refBookTitle,\n                description: 'Title of the book.',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.property_refPublisher,\n                description: 'Publisher of the book.',\n                format: TagFormat.plainText,\n                maxCount: Count.infinity,\n              },\n              {\n                key: ConfigKey.property_refPublicationYear,\n                description: 'Year of publication of the book.',\n                format: TagFormat.plainText,\n              },\n              {\n                key: ConfigKey.property_citationStyle,\n                description: 'Citation style for the book reference.',\n                format: TagFormat.plainText,\n              },\n            ],\n          },\n        ],\n      },\n    ],\n  },\n};\n\nexport { CARDSETS as CARDS };\n","import { type _GroupsConfig } from '../../model/config/_Config.ts';\nimport { ConfigKey } from '../../model/config/enum/ConfigKey.ts';\nimport { GroupConfigType } from '../../model/config/enum/GroupConfigType.ts';\nimport { Count } from '../../model/enum/Count.ts';\nimport { TagFormat } from '../../model/enum/TagFormat.ts';\n\nconst GROUPS: _GroupsConfig = {\n  [ConfigKey.group_standardAllBits]: {\n    name: 'Standard',\n    description: 'Standard tags which apply to all bits',\n    type: GroupConfigType.standard,\n    tags: [\n      {\n        key: ConfigKey.property_id,\n        description: 'The unique identifier(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_gUri,\n        description: 'Global URI for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_customerId,\n        description: 'The customer-specific identifier for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_externalId,\n        description: 'The external identifier for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n        // PLAN-140 refs family (NISO import): the machine identifier of a\n        // referenced standard. NESTED content slot — the tag reads (and\n        // consumes) ONLY the <std-id> inside a <std> child; the remaining\n        // designation/title text stays bit body. A <std> without <std-id>\n        // does not fire the key.\n        // PLAN-141 F5: on the [.book] bit, the DATED <std-ref> designation\n        // is the document's external id. Safe rule order: <std-ref> is a\n        // direct bit-element child only under <std-meta> (everywhere else\n        // it nests inside <std>, which the tag spine never reaches).\n        mappingKeys: {\n          'xml-niso-iec': [\n            { '@el': 'std', '@children': { '@el': 'std-id', '@text': '$' } },\n            { '@el': 'std-ref', '@attr': { type: 'dated' }, '@text': '$' },\n          ],\n        },\n      },\n      {\n        key: ConfigKey.property_sourceRL,\n        description: 'The original location of the information in the original source material',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_copyright,\n        description: 'The copyright information for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_license,\n        description: 'The license for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_rightsPolicy,\n        description: 'The rights policy or policies for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_isTemplate,\n        description: 'If true, the bit is a template',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_isTemplateStripTheme,\n        description: 'If true, the bit is a template strip theme',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_needsValidation,\n        description: 'If true, the bit needs validation',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_validationDate,\n        description: 'The date when the bit was validated',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_aiGenerated,\n        description: 'If true, the bit is AI-generated',\n        format: TagFormat.boolean,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_machineTranslated,\n        description: 'If true, the bit is machine-translated',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_translationOf,\n        description: 'Translation source reference',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible',\n        format: TagFormat.boolean,\n      },\n      {\n        key: ConfigKey.property_spansPageBreak,\n        description: 'If true, the bit spans a page break',\n        format: TagFormat.boolean,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_searchIndex,\n        description: 'The search index(es) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_analyticsTag,\n        description: 'The analytics tag(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_categoryTag,\n        description: 'The category tag(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_topicTag,\n        description: 'The topic tag(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_reportTag,\n        description: 'The report tag(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_altLangTag,\n        description: 'The alternative language tag for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_feedbackEngine,\n        description: 'The feedback engine for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_feedbackType,\n        description: 'The feedback type for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_disableFeedback,\n        description: 'If true, feedback is disabled for the bit',\n        format: TagFormat.boolean,\n      },\n      {\n        key: ConfigKey.property_diffTo,\n        description: 'The diff to version for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_diffOp,\n        description: 'The diff operation for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_diffRef,\n        description: 'The diff reference for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_diffContext,\n        description: 'The diff context for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_diffTime,\n        description: 'The diff time for the bit',\n        format: TagFormat.number,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_ageRange,\n        description: 'The age range for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_lang,\n        description: 'The language for the bit',\n        format: TagFormat.plainText,\n        // PLAN-141 F3 (NISO import): a term-sec's language rides\n        // <tbx:termEntry><tbx:langSet xml:lang> — a nested content slot\n        // whose leaf is a $-in-ATTR-position slot (the nested counterpart\n        // of the value-attr slot). Only termEntry elements match, so the\n        // shared tag is inert everywhere else.\n        mappingKeys: {\n          'xml-niso-iec': {\n            '@el': 'tbx:termEntry',\n            '@children': { '@el': 'tbx:langSet', '@attr': { 'xml:lang': '$' } },\n          },\n        },\n      },\n      {\n        key: ConfigKey.property_publisher,\n        description: 'The publisher(s) of the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_publisherName,\n        description: 'The name of the publisher of the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_theme,\n        description: 'The theme(s) for the bit',\n        format: TagFormat.plainText,\n        nullable: true,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_rtl,\n        description: 'If true, the book is right-to-left',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_target,\n        description: 'The target(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_tag,\n        description: 'The tag(s) for the bit',\n        format: TagFormat.plainText,\n        nullable: true,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_groupTag,\n        jsonKey: 'groupTag.name',\n        // PLAN-063: starter-array shape with `@id` declares entity-merge\n        // semantics — repeated `[@groupTag: name]` occurrences with the\n        // same value fold into one entry; chained `@tag` children's\n        // arrays merge as sets.\n        exportJsonKey: { groupTag: [{ '@id': 'name', name: '$' }] },\n        description: 'The group tag(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n        chain: [\n          {\n            key: ConfigKey.property_tag,\n            exportJsonKey: { tags: ['$'] },\n            description: 'The tag(s) for the group',\n            format: TagFormat.plainText,\n            nullable: true,\n            maxCount: Count.infinity,\n          },\n        ],\n      },\n      {\n        key: ConfigKey.property_reviewTag,\n        description: 'The review tag(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_reviewerTag,\n        description: 'The reviewer tag(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_reductionTag,\n        description: 'The reduction tag(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_bubbleTag,\n        description: 'The bubble tag(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_extractorTag,\n        description: 'The extractor tag(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_extractorInternal,\n        description: 'Internal metadata used by the extractor for processing purposes',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_sourceBB,\n        description: 'The source bounding box(es) for the bit (x, y, x1, y1)',\n        format: TagFormat.coordinates,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_bitFingerprint,\n        description:\n          'Fingerprint(s) used by the AI extractor to identify the bit (font, style, color, pixels, etc.)',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_levelCEFRp,\n        description: 'The CEFRp level for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_levelCEFR,\n        description: 'The CEFR level for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_levelILR,\n        description: 'The ILR level for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_levelACTFL,\n        description: 'The ACTFL level for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_icon,\n        description: 'The icon for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_iconTag,\n        description: 'The icon tag for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_colorTag,\n        description: 'The color tag(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        exportJsonKey: { anchor: '$' },\n        key: ConfigKey.tag_anchor,\n        name: 'Anchor',\n        format: TagFormat.plainText,\n        description: 'The anchor for the bit',\n      },\n      {\n        key: ConfigKey.property_search,\n        description: 'The search text for the bit',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_showInIndex,\n        description: 'If true, the bit is shown in the index',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_layer,\n        description: 'The layer(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_layerRole,\n        description: 'The layer role(s) for the bit',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        // Universal @internalComment — declares in config what Config.ts also\n        // injects programmatically into every bit (its push runs last and wins\n        // the keyed merge, so runtime behaviour is unchanged). Declared here so\n        // the config export (ConfigBuilder → assets/config → configurator →\n        // bitmark.json) carries the tag for downstream parsers. Empty\n        // exportJsonKey: consumed but never emitted to the bit JSON (the value\n        // is routed to parser.internalComments).\n        key: ConfigKey.property_internalComment,\n        description: 'Internal comment for the bit.',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n        exportJsonKey: {},\n      },\n    ],\n  },\n  [ConfigKey.group_standardItemLead]: {\n    type: GroupConfigType.standard,\n    description: 'Standard group for item, lead, page number, and margin number tags',\n    tags: [\n      {\n        key: ConfigKey.tag_item,\n        jsonKey: 'item',\n        exportJsonKey: { item: '$' },\n        // PLAN-140 W3 (NISO import): the clause/note label of a mapped\n        // source element ([%1], [%ANMERKUNG 1]).\n        mappingKeys: { 'xml-niso-iec': { '@el': 'label', '@text': '$' } },\n        description: 'The item for the bit',\n        chain: [\n          {\n            key: ConfigKey.tag_item,\n            jsonKey: 'lead',\n            exportJsonKey: { lead: '$' },\n            description: 'The lead for the bit',\n            maxCount: 1,\n            chain: [\n              {\n                key: ConfigKey.tag_item,\n                jsonKey: 'pageNumber',\n                exportJsonKey: { pageNumber: '$' },\n                description: 'The page number for the bit',\n                maxCount: 1,\n                chain: [\n                  {\n                    key: ConfigKey.tag_item,\n                    jsonKey: 'marginNumber',\n                    exportJsonKey: { marginNumber: '$' },\n                    description: 'The margin number for the bit',\n                    maxCount: 1,\n                  },\n                ],\n              },\n            ],\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_standardItemLeadInstructionHint]: {\n    type: GroupConfigType.standard,\n    description:\n      'Standard group for item, lead, page number, margin number, instruction and hint tags',\n    tags: [\n      {\n        key: ConfigKey.group_standardItemLead,\n        description: 'Item, lead, page number, and margin number tags',\n      },\n      {\n        exportJsonKey: { instruction: '$' },\n        key: ConfigKey.tag_instruction,\n        name: 'Instruction',\n        description: 'The instruction for the bit',\n      },\n      {\n        exportJsonKey: { hint: '$' },\n        key: ConfigKey.tag_hint,\n        name: 'Hint',\n        description: 'The hint for the bit',\n      },\n    ],\n  },\n  [ConfigKey.group_standardInstructionHint]: {\n    type: GroupConfigType.standard,\n    description:\n      'Standard group for instruction and hint tags only (no item/lead/pageNumber/marginNumber chain). Used by sides where item/lead are owned by another side (e.g. matchPairs value-side, which BPG strips item/lead from at sideIdx > 0).',\n    tags: [\n      {\n        exportJsonKey: { instruction: '$' },\n        key: ConfigKey.tag_instruction,\n        name: 'Instruction',\n        description: 'The instruction for the bit',\n      },\n      {\n        exportJsonKey: { hint: '$' },\n        key: ConfigKey.tag_hint,\n        name: 'Hint',\n        description: 'The hint for the bit',\n      },\n    ],\n  },\n  [ConfigKey.group_standardTags]: {\n    type: GroupConfigType.standard,\n    description: 'Standard tags which apply to MOST (but not all) bits',\n    tags: [\n      {\n        key: ConfigKey.group_standardAllBits,\n        description: 'All standard tags which apply to all bits',\n      },\n      {\n        key: ConfigKey.group_standardItemLeadInstructionHint,\n        description: 'Item, lead, page number, margin number, instruction and hint tags',\n      },\n      {\n        // Bit-level example tag (default — non-`isTopLevelExample` bits):\n        // - bare `[@example]`: consume only (records cascade marker, emits\n        //   nothing at bit-level — OLD parser scrubs bit-level isExample\n        //   for bits NOT in its `isTopLevelExample` allow-list).\n        // - synthesized (descendant cascade): still emits `isExample: true`\n        //   at the descendant scope.\n        // - valued `[@example:text]`: emit the example value only; bit-level\n        //   `isExample` is left to bubble from descendants.\n        // Bits in the OLD parser's allow-list (flashcard, definitionList,\n        // sequence, multipleChoice, trueFalse, cloze*, mark, interview,\n        // matchMatrix, match, essay, etc.) override this entry with the\n        // legacy emit-isExample shape.\n        key: ConfigKey.property_example,\n        exportJsonKey: [{ '@keyonly': {} }, { '@absent': { isExample: true } }, { example: '$' }],\n        description: 'The example(s) for the bit',\n        format: TagFormat.bitmarkText,\n        nullable: true,\n      },\n    ],\n  },\n  [ConfigKey.group_standardTagsNoItemLead]: {\n    type: GroupConfigType.standard,\n    description:\n      'Standard tags mirror of group_standardTags but excluding the item/lead/pageNumber/marginNumber chain. Used by sides where item/lead are owned by another side (e.g. matchPairs value-side — BPG `parseMatchPairs` strips tags.item / tags.lead for sideIdx > 0).',\n    tags: [\n      {\n        key: ConfigKey.group_standardAllBits,\n        description: 'All standard tags which apply to all bits',\n      },\n      {\n        key: ConfigKey.group_standardInstructionHint,\n        description: 'Instruction and hint tags only (no item/lead chain).',\n      },\n      {\n        // Mirror of group_standardTags property_example entry.\n        key: ConfigKey.property_example,\n        exportJsonKey: [{ '@keyonly': {} }, { '@absent': { isExample: true } }, { example: '$' }],\n        description: 'The example(s) for the bit',\n        format: TagFormat.bitmarkText,\n        nullable: true,\n      },\n    ],\n  },\n  [ConfigKey.group_imageSource]: {\n    type: GroupConfigType.standard,\n    description: 'Image source chain',\n    tags: [\n      {\n        key: ConfigKey.property_imageSource,\n        jsonKey: 'imageSource.url',\n        exportJsonKey: { imageSource: { url: '$' } },\n        description: 'The source of an image',\n        format: TagFormat.plainText,\n        chain: [\n          {\n            key: ConfigKey.property_mockupId,\n            description: 'The mockup ID for the image',\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.property_size,\n            description: 'The size of the image',\n            format: TagFormat.number,\n            nullable: true,\n          },\n          {\n            key: ConfigKey.property_format,\n            description: 'The format of the image',\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.property_trim,\n            description: 'If true, the image is trimmed',\n            format: TagFormat.boolean,\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_technicalTerm]: {\n    type: GroupConfigType.standard,\n    description: 'Technical term chain',\n    tags: [\n      {\n        key: ConfigKey.property_technicalTerm,\n        jsonKey: 'technicalTerm.technicalTerm',\n        exportJsonKey: { technicalTerm: { technicalTerm: '$' } },\n        description: 'The technical term',\n        format: TagFormat.plainText,\n        chain: [\n          {\n            key: ConfigKey.property_lang,\n            description: 'The language of the technical term',\n            format: TagFormat.plainText,\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_person]: {\n    type: GroupConfigType.standard,\n    description: 'Person chain',\n    tags: [\n      {\n        key: ConfigKey.property_person,\n        jsonKey: 'person.name',\n        exportJsonKey: { person: { name: '$' } },\n        description: 'A person',\n        format: TagFormat.plainText,\n        chain: [\n          {\n            key: ConfigKey.property_title,\n            description: \"The person's title\",\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.group_resourceImage,\n            jsonKey: 'avatarImage|resource(type=image, key=image)',\n            exportJsonKey: { avatarImage: { type: 'image', image: { src: '$' } } },\n            description: 'The image of the person',\n          },\n        ],\n      },\n      {\n        // Deprecated (parter renamed to person)\n        key: ConfigKey.property_partner,\n        jsonKey: 'person.name',\n        exportJsonKey: { person: { name: '$' } },\n        description: 'A partner',\n        format: TagFormat.plainText,\n        chain: [\n          {\n            key: ConfigKey.property_title,\n            description: \"The partner's title\",\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.group_resourceImage,\n            jsonKey: 'avatarImage|resource(type=image, key=image)',\n            exportJsonKey: { avatarImage: { type: 'image', image: { src: '$' } } },\n            description: 'The image of the partner',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_gap]: {\n    type: GroupConfigType.standard,\n    description: 'Gap chain',\n    tags: [\n      {\n        exportJsonKey: {\n          '@body-inline': { type: 'gap', attrs: { solutions: ['$'] } },\n        },\n        key: ConfigKey.tag_gap,\n        description: 'The value of a gap in the content',\n        maxCount: Count.infinity,\n        format: TagFormat.plainText,\n        chain: [\n          {\n            key: ConfigKey.tag_gap,\n            jsonKey: 'solutions[]',\n            exportJsonKey: { solutions: ['$'] },\n            description: 'Alternative values for the gaps in the content',\n            maxCount: Count.infinity,\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.group_standardItemLeadInstructionHint,\n            description: 'Item, lead, page number, margin number, instruction and hint tags',\n          },\n          {\n            // BPG ExampleTagContentProcessor.ts:91-95 reads\n            // `__solutionsAst[length - 1]` — the solution closest to the\n            // `[@example]` tag at parse time. Our chain accumulator is built\n            // incrementally (scope.rs `parent.merge` after each tag), so at\n            // the moment `[@example]` fires, `solutions` only contains the\n            // preceding `[_x]` entries — `[-1]` resolves to the closest one.\n            // E.g. `[_cloze][_gap][@example]` → solutions=[\"cloze\",\"gap\"],\n            // `[-1]`=\"gap\"; `[_solution][@example][_problem]` →\n            // solutions=[\"solution\"], `[-1]`=\"solution\".\n            key: ConfigKey.property_example,\n            jsonKey: 'example',\n            exportJsonKey: [\n              {\n                '@keyonly': {\n                  isExample: true,\n                  example: '$parent.solutions[-1]',\n                  '@bit': { isExample: true },\n                },\n              },\n              {\n                '@absent': {\n                  isExample: true,\n                  example: '$parent.solutions[-1]',\n                  '@bit': { isExample: true },\n                },\n              },\n              { isExample: true, example: '$', '@bit': { isExample: true } },\n            ],\n            description: 'An example for the gap',\n            format: TagFormat.bitmarkText,\n            nullable: true,\n          },\n          {\n            key: ConfigKey.property_isCaseSensitive,\n            jsonKey: 'isCaseSensitive',\n            exportJsonKey: [\n              { '@absent': { isCaseSensitive: '$ancestor' } },\n              { isCaseSensitive: '$' },\n            ],\n            description: 'If true, the gap text is case sensitive',\n            format: TagFormat.boolean,\n            defaultValue: 'true',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_trueFalse]: {\n    type: GroupConfigType.standard,\n    description: 'True/False chain',\n    tags: [\n      {\n        exportJsonKey: { choices: [{ choice: '$', isCorrect: true }] },\n        key: ConfigKey.tag_true,\n        description: 'True value for a true/false statement/question',\n        maxCount: Count.infinity,\n        format: TagFormat.plainText,\n        chain: [\n          {\n            key: ConfigKey.tag_true,\n            jsonKey: 'choices[]|set(isCorrect=true)',\n            exportJsonKey: { choices: [{ choice: '$', isCorrect: true }] },\n            description: 'True values for a true/false statement/question',\n            maxCount: Count.infinity,\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.tag_false,\n            jsonKey: 'choices[]|set(isCorrect=false)',\n            exportJsonKey: { choices: [{ choice: '$', isCorrect: false }] },\n            description: 'False values for a true/false statement/question',\n            maxCount: Count.infinity,\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.group_standardItemLeadInstructionHint,\n            description: 'Item, lead, page number, margin number, instruction and hint tags',\n          },\n          {\n            // PLAN-072 + ALIGN-EXAMPLE-CASCADE §3.2, corrected by\n            // bpg 5.31 probing: cascade-fired `@example` decorates only\n            // the FIRST correct choice (`example: true` via the\n            // `@parent.isCorrect`-gated `@absent` rule, `maxEmits:1` —\n            // BPG `fillBooleanExample(..., firstCorrectOnly=true)`).\n            // There is deliberately NO plain `@absent` rule: an ancestor\n            // bare example must leave the remaining choices untouched\n            // (a plain `@absent` decoration broke the\n            // `optimize(fullize(x)) == optimize(x)` law — the\n            // synthesized `isExample` keys survived re-optimization).\n            // The `serialize_cards` cascade-counter scope holds the cap\n            // across the whole cardset.\n            // @card scope-shift writes choice-container isExample (e.g.\n            // `quizzes[i].isExample`) — was previously provided by the\n            // universal `bubble_is_example` post-walk, which was removed\n            // in favour of explicit per-tag config. SYNTAX.md §8.\n            key: ConfigKey.property_example,\n            jsonKey: 'example',\n            exportJsonKey: [\n              {\n                '@keyonly': {\n                  isExample: true,\n                  example: '$parent.isCorrect',\n                  '@bit': { isExample: true },\n                  '@card': { isExample: true },\n                },\n              },\n              {\n                predicates: ['@absent', { '@parent.isCorrect': true }],\n                maxEmits: 1,\n                rule: {\n                  isExample: true,\n                  example: true,\n                  '@bit': { isExample: true },\n                  '@card': { isExample: true },\n                },\n              },\n              {\n                isExample: true,\n                example: '$',\n                '@bit': { isExample: true },\n                '@card': { isExample: true },\n              },\n            ],\n            description: 'An example for the true/false statement/question',\n            format: TagFormat.boolean,\n            nullable: true,\n          },\n        ],\n      },\n      {\n        exportJsonKey: { choices: [{ choice: '$', isCorrect: false }] },\n        key: ConfigKey.tag_false,\n        description: 'False value for a true/false statement/question',\n        maxCount: Count.infinity,\n        format: TagFormat.plainText,\n        chain: [\n          {\n            key: ConfigKey.tag_true,\n            jsonKey: 'choices[]|set(isCorrect=true)',\n            exportJsonKey: { choices: [{ choice: '$', isCorrect: true }] },\n            description: 'True values for a true/false statement/question',\n            maxCount: Count.infinity,\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.tag_false,\n            jsonKey: 'choices[]|set(isCorrect=false)',\n            exportJsonKey: { choices: [{ choice: '$', isCorrect: false }] },\n            description: 'False values for a true/false statement/question',\n            maxCount: Count.infinity,\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.group_standardItemLeadInstructionHint,\n            description: 'Item, lead, page number, margin number, instruction and hint tags',\n          },\n          {\n            // PLAN-072 + ALIGN-EXAMPLE-CASCADE §3.2, corrected by\n            // bpg 5.31 probing: an ancestor bare `@example` leaves\n            // incorrect choices UNTOUCHED — no cascade decoration at\n            // all (no `@absent` rule; a plain `@absent → isExample`\n            // decoration broke the `optimize(fullize(x)) ==\n            // optimize(x)` law). Only an explicit `[@example]` on the\n            // choice itself emits.\n            // @card scope-shift writes choice-container isExample.\n            key: ConfigKey.property_example,\n            jsonKey: 'example',\n            exportJsonKey: [\n              {\n                '@keyonly': {\n                  isExample: true,\n                  example: '$parent.isCorrect',\n                  '@bit': { isExample: true },\n                  '@card': { isExample: true },\n                },\n              },\n              {\n                isExample: true,\n                example: '$',\n                '@bit': { isExample: true },\n                '@card': { isExample: true },\n              },\n            ],\n            description:\n              'An example for the true/false statement/question (incorrect entry — no cascade decoration: an ancestor bare example leaves incorrect choices untouched, bpg 5.31)',\n            format: TagFormat.boolean,\n            nullable: true,\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_trueFalseResponses]: {\n    type: GroupConfigType.standard,\n    description: 'True/False Responses chain',\n    tags: [\n      {\n        exportJsonKey: { responses: [{ response: '$', isCorrect: true }] },\n        key: ConfigKey.tag_true,\n        description: 'True value for a true/false statement/question',\n        maxCount: Count.infinity,\n        format: TagFormat.plainText,\n        chain: [\n          {\n            key: ConfigKey.tag_true,\n            jsonKey: 'responses[]|set(isCorrect=true)',\n            exportJsonKey: { responses: [{ response: '$', isCorrect: true }] },\n            description: 'True values for a true/false statement/question',\n            maxCount: Count.infinity,\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.tag_false,\n            jsonKey: 'responses[]|set(isCorrect=false)',\n            exportJsonKey: { responses: [{ response: '$', isCorrect: false }] },\n            description: 'False values for a true/false statement/question',\n            maxCount: Count.infinity,\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.group_standardItemLeadInstructionHint,\n            description: 'Item, lead, page number, margin number, instruction and hint tags',\n          },\n          {\n            // @card scope-shift writes response-container isExample.\n            key: ConfigKey.property_example,\n            jsonKey: 'example',\n            exportJsonKey: [\n              {\n                '@keyonly': {\n                  isExample: true,\n                  example: '$parent.isCorrect',\n                  '@bit': { isExample: true },\n                  '@card': { isExample: true },\n                },\n              },\n              {\n                '@absent': {\n                  isExample: '$parent.isCorrect',\n                  example: '$parent.isCorrect',\n                  '@bit': { isExample: '$parent.isCorrect' },\n                  '@card': { isExample: '$parent.isCorrect' },\n                },\n              },\n              {\n                isExample: true,\n                example: '$',\n                '@bit': { isExample: true },\n                '@card': { isExample: true },\n              },\n            ],\n            description: 'An example for the true/false statement/question',\n            format: TagFormat.boolean,\n            nullable: true,\n          },\n        ],\n      },\n      {\n        exportJsonKey: { responses: [{ response: '$', isCorrect: false }] },\n        key: ConfigKey.tag_false,\n        description: 'False value for a true/false statement/question',\n        maxCount: Count.infinity,\n        format: TagFormat.plainText,\n        chain: [\n          {\n            key: ConfigKey.tag_true,\n            jsonKey: 'responses[]|set(isCorrect=true)',\n            exportJsonKey: { responses: [{ response: '$', isCorrect: true }] },\n            description: 'True values for a true/false statement/question',\n            maxCount: Count.infinity,\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.tag_false,\n            jsonKey: 'responses[]|set(isCorrect=false)',\n            exportJsonKey: { responses: [{ response: '$', isCorrect: false }] },\n            description: 'False values for a true/false statement/question',\n            maxCount: Count.infinity,\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.group_standardItemLeadInstructionHint,\n            description: 'Item, lead, page number, margin number, instruction and hint tags',\n          },\n          {\n            // @card scope-shift writes response-container isExample.\n            key: ConfigKey.property_example,\n            jsonKey: 'example',\n            exportJsonKey: [\n              {\n                '@keyonly': {\n                  isExample: true,\n                  example: '$parent.isCorrect',\n                  '@bit': { isExample: true },\n                  '@card': { isExample: true },\n                },\n              },\n              {\n                '@absent': {\n                  isExample: true,\n                  example: '$parent.isCorrect',\n                  '@bit': { isExample: true },\n                  '@card': { isExample: true },\n                },\n              },\n              {\n                isExample: true,\n                example: '$',\n                '@bit': { isExample: true },\n                '@card': { isExample: true },\n              },\n            ],\n            description: 'An example for the true/false statement/question',\n            format: TagFormat.boolean,\n            nullable: true,\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_trueFalseInlineSelect]: {\n    type: GroupConfigType.standard,\n    description:\n      'True/False chain composed inline (select body-bit). +/- tags are consume-only at bit level.',\n    tags: [\n      {\n        exportJsonKey: {\n          '@body-inline': {\n            type: 'select',\n            attrs: { options: [{ text: '$', isCorrect: true }] },\n          },\n        },\n        key: ConfigKey.tag_true,\n        description: 'True value for an inline select body bit',\n        maxCount: Count.infinity,\n        format: TagFormat.plainText,\n        chain: [\n          {\n            key: ConfigKey.tag_true,\n            exportJsonKey: {},\n            description: 'True values for an inline select body bit',\n            maxCount: Count.infinity,\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.tag_false,\n            exportJsonKey: {},\n            description: 'False values for an inline select body bit',\n            maxCount: Count.infinity,\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.group_standardItemLeadInstructionHint,\n            description: 'Item, lead, page number, margin number, instruction and hint tags',\n          },\n          {\n            // PLAN-083: cascade-fired `@example` from bit header fires\n            // `isExample:true, example:true` on the FIRST CORRECT option\n            // only (BPG `fillBooleanExample(select.options,\n            // firstCorrectOnly=true)`). Mirrors group_trueFalseInlineHighlight.\n            // Every rule also bubbles `@bit:{isExample:true}` (idempotent\n            // OR — any cascade ⇒ bit marked) and\n            // `@body-inline:{attrs:{isExample:true}}` (node-level marker\n            // on the select node).\n            key: ConfigKey.property_example,\n            jsonKey: 'example',\n            exportJsonKey: [\n              {\n                '@keyonly': {\n                  isExample: true,\n                  example: '$parent.isCorrect',\n                  '@bit': { isExample: true },\n                  '@body-inline': { attrs: { isExample: true } },\n                },\n              },\n              {\n                predicates: ['@absent', { '@parent.isCorrect': true }],\n                maxEmits: 1,\n                rule: {\n                  isExample: true,\n                  example: true,\n                  '@bit': { isExample: true },\n                  '@body-inline': { attrs: { isExample: true } },\n                },\n              },\n              {\n                isExample: true,\n                example: '$',\n                '@bit': { isExample: true },\n                '@body-inline': { attrs: { isExample: true } },\n              },\n            ],\n            description: 'An example for the inline select option (first correct only)',\n            format: TagFormat.boolean,\n            nullable: true,\n          },\n        ],\n      },\n      {\n        exportJsonKey: {\n          '@body-inline': {\n            type: 'select',\n            attrs: { options: [{ text: '$', isCorrect: false }] },\n          },\n        },\n        key: ConfigKey.tag_false,\n        description: 'False value for an inline select body bit',\n        maxCount: Count.infinity,\n        format: TagFormat.plainText,\n        chain: [\n          {\n            key: ConfigKey.tag_true,\n            exportJsonKey: {},\n            description: 'True values for an inline select body bit',\n            maxCount: Count.infinity,\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.tag_false,\n            exportJsonKey: {},\n            description: 'False values for an inline select body bit',\n            maxCount: Count.infinity,\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.group_standardItemLeadInstructionHint,\n            description: 'Item, lead, page number, margin number, instruction and hint tags',\n          },\n          {\n            // PLAN-083: identical to the `+` lead's chain @example —\n            // cascade reaches the first correct option regardless of\n            // which lead (+/-) opens the chain. Every firing rule bubbles\n            // `@bit:{isExample:true}` and `@body-inline:{attrs:{isExample:true}}`.\n            key: ConfigKey.property_example,\n            jsonKey: 'example',\n            exportJsonKey: [\n              {\n                '@keyonly': {\n                  isExample: true,\n                  example: '$parent.isCorrect',\n                  '@bit': { isExample: true },\n                  '@body-inline': { attrs: { isExample: true } },\n                },\n              },\n              {\n                predicates: ['@absent', { '@parent.isCorrect': true }],\n                maxEmits: 1,\n                rule: {\n                  isExample: true,\n                  example: true,\n                  '@bit': { isExample: true },\n                  '@body-inline': { attrs: { isExample: true } },\n                },\n              },\n              {\n                isExample: true,\n                example: '$',\n                '@bit': { isExample: true },\n                '@body-inline': { attrs: { isExample: true } },\n              },\n            ],\n            description: 'An example for the inline select option (first correct only)',\n            format: TagFormat.boolean,\n            nullable: true,\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_trueFalseInlineHighlight]: {\n    type: GroupConfigType.standard,\n    description:\n      'True/False chain composed inline (highlight body-bit). +/- tags emit `{type:\"highlight\", attrs:{texts:[{text,isCorrect?}]}}` inline body nodes. Used by highlight-text bit.',\n    tags: [\n      {\n        exportJsonKey: {\n          '@body-inline': {\n            type: 'highlight',\n            attrs: { texts: [{ text: '$', isCorrect: true }] },\n          },\n        },\n        key: ConfigKey.tag_true,\n        description: 'Highlighted span in the body (correct)',\n        maxCount: Count.infinity,\n        format: TagFormat.plainText,\n        chain: [\n          {\n            key: ConfigKey.tag_true,\n            exportJsonKey: {},\n            description: 'Highlighted span values (correct)',\n            maxCount: Count.infinity,\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.tag_false,\n            exportJsonKey: {},\n            description: 'Highlighted span values (incorrect)',\n            maxCount: Count.infinity,\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.group_standardItemLeadInstructionHint,\n            description: 'Item, lead, page number, margin number, instruction and hint tags',\n          },\n          {\n            // PLAN-072 + ALIGN-EXAMPLE-CASCADE §3.13: cascade-fired\n            // `@example` from the bit header fires `example: true` +\n            // `isExample: true` on the FIRST correct highlight only\n            // (BPG `fillBooleanExample(highlight.texts,\n            // firstCorrectOnly=true)`). Incorrect highlights get\n            // nothing (unlike choices, the highlight-text fixture\n            // shows no `isExample` on incorrect entries).\n            key: ConfigKey.property_example,\n            jsonKey: 'example',\n            exportJsonKey: [\n              {\n                '@keyonly': {\n                  isExample: true,\n                  example: '$parent.isCorrect',\n                  '@bit': { isExample: true },\n                  '@body-inline': { attrs: { isExample: true } },\n                },\n              },\n              {\n                predicates: ['@absent', { '@parent.isCorrect': true }],\n                maxEmits: 1,\n                rule: {\n                  isExample: true,\n                  example: true,\n                  '@bit': { isExample: true },\n                  '@body-inline': { attrs: { isExample: true } },\n                },\n              },\n              {\n                isExample: true,\n                example: '$',\n                '@bit': { isExample: true },\n                '@body-inline': { attrs: { isExample: true } },\n              },\n            ],\n            description: 'An example for the highlighted span (first correct only)',\n            format: TagFormat.boolean,\n            nullable: true,\n          },\n        ],\n      },\n      {\n        // PLAN-083 follow-up (2026-05-22): mirror the select `-` lead shape\n        // by writing `isCorrect: false`. Without it, `$parent.isCorrect` in\n        // chain-child @example rules resolves to ParentPathMissing for `-`\n        // entries (e.g. `[-fish][@example]`), so the @keyonly rule falls\n        // through and nothing fires. The natural-default strip removes\n        // `isCorrect: false` from the final texts entries (matches fixture).\n        exportJsonKey: {\n          '@body-inline': {\n            type: 'highlight',\n            attrs: { texts: [{ text: '$', isCorrect: false }] },\n          },\n        },\n        key: ConfigKey.tag_false,\n        description: 'Highlighted span in the body (incorrect)',\n        maxCount: Count.infinity,\n        format: TagFormat.plainText,\n        chain: [\n          {\n            key: ConfigKey.tag_true,\n            exportJsonKey: {},\n            description: 'Highlighted span values (correct)',\n            maxCount: Count.infinity,\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.tag_false,\n            exportJsonKey: {},\n            description: 'Highlighted span values (incorrect)',\n            maxCount: Count.infinity,\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.group_standardItemLeadInstructionHint,\n            description: 'Item, lead, page number, margin number, instruction and hint tags',\n          },\n          {\n            // PLAN-072 + ALIGN-EXAMPLE-CASCADE §3.13: cascade-fired\n            // `@example` on a `-` (incorrect highlight) emits nothing\n            // (highlight-text fixture has no `isExample` on incorrect\n            // entries; firstCorrectOnly cascade skips them entirely).\n            // No `@absent` rule.\n            // PLAN-083: identical to the `+` lead's chain @example —\n            // cascade reaches the first correct option regardless of\n            // which lead (+/-) opens the chain.\n            key: ConfigKey.property_example,\n            jsonKey: 'example',\n            exportJsonKey: [\n              {\n                '@keyonly': {\n                  isExample: true,\n                  example: '$parent.isCorrect',\n                  '@bit': { isExample: true },\n                  '@body-inline': { attrs: { isExample: true } },\n                },\n              },\n              {\n                predicates: ['@absent', { '@parent.isCorrect': true }],\n                maxEmits: 1,\n                rule: {\n                  isExample: true,\n                  example: true,\n                  '@bit': { isExample: true },\n                  '@body-inline': { attrs: { isExample: true } },\n                },\n              },\n              {\n                isExample: true,\n                example: '$',\n                '@bit': { isExample: true },\n                '@body-inline': { attrs: { isExample: true } },\n              },\n            ],\n            description: 'An example for the highlighted span (first correct only)',\n            format: TagFormat.boolean,\n            nullable: true,\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_markConfig]: {\n    type: GroupConfigType.standard,\n    description: 'Mark configuration chain',\n    tags: [\n      {\n        key: ConfigKey.property_mark,\n        jsonKey: 'marks.mark',\n        // `emphasis: 'underline'` is the per-entry default for mark\n        // configs — mirrors the hardcoded default in BPG\n        // `MarkConfigChainContentProcessor.ts:55-58`. Chained\n        // `[@emphasis:…]` overrides via deep-merge into `marks[-1]`.\n        exportJsonKey: { marks: [{ mark: '$', emphasis: 'underline' }] },\n        description: 'The mark configuration',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n        chain: [\n          {\n            key: ConfigKey.property_color,\n            description: 'The color of the mark',\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.property_emphasis,\n            description: 'The emphasis of the mark',\n            format: TagFormat.plainText,\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_mark]: {\n    type: GroupConfigType.standard,\n    description: 'Mark chain',\n    tags: [\n      {\n        exportJsonKey: {\n          '@body-inline': { type: 'mark', attrs: { solution: '$' } },\n        },\n        key: ConfigKey.tag_mark,\n        description: 'The marked content',\n        maxCount: Count.infinity,\n        format: TagFormat.plainText,\n        chain: [\n          {\n            key: ConfigKey.property_mark,\n            jsonKey: 'mark',\n            exportJsonKey: { mark: '$' },\n            description: 'The mark configuration',\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.property_example,\n            jsonKey: 'example',\n            // Per-mark `@example` is a boolean toggle. BPG's runtime\n            // `ExampleTagContentProcessor.handleDefaultOnlyExample`\n            // (lines 147-161) normalises ANY `[@example]` or\n            // `[@example:V]` on a mark body-bit to\n            // `__isDefaultExample=true, example=undefined`; the\n            // downstream `toExample(_, _, defaultExample=true)` in\n            // `BaseBuilder.ts:80-87` then emits `example: true`\n            // regardless of source. Declare a single unconditional\n            // boolean-shape rule so the exported schema matches that\n            // runtime semantic instead of the misleading `example: $`\n            // shape (which would only fire if `handleDefaultOnlyExample`\n            // were removed). `@bit: {isExample: true}` cascades the\n            // marker — but NOT the `example` value — to bit root.\n            exportJsonKey: { isExample: true, example: true, '@bit': { isExample: true } },\n            description: 'An example for the marked content',\n            format: TagFormat.boolean,\n            nullable: true,\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_bookCommon]: {\n    type: GroupConfigType.standard,\n    description: 'Common book tags',\n    tags: [\n      {\n        key: ConfigKey.property_language,\n        description: 'The language of the book',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n        // PLAN-141 F5 (NISO import): only the PRIMARY (first)\n        // <content-language> survives — the maxEmits cap realises the\n        // catalog's document-language rule (extras drop, R-4).\n        mappingKeys: {\n          'xml-niso-iec': [\n            { predicates: [], maxEmits: 1, rule: { '@el': 'content-language', '@text': '$' } },\n          ],\n        },\n      },\n      {\n        key: ConfigKey.property_displayName,\n        description: 'The display name of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_customerExternalId,\n        description: 'The customer-specific external identifier for the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_spaceId,\n        description: 'The space ID for the book',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_kind,\n        description: 'The kind of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_hasMarkAsDone,\n        description: 'If true, the book has a \"Mark as done\" feature',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_processHandIn,\n        description: 'If true, the book will be processed when upon hand-in',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_processHandInLocation,\n        description: 'The location where the book was handed-in',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_isPublic,\n        description: 'If true, the book is public',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_isTemplate,\n        description: 'If true, the book is a template',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_isTemplateStripTheme,\n        description: 'If true, the book is a template strip theme',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_isEditable,\n        description: 'If true, the book is editable',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_chatWithBook,\n        description: 'If true, the user can chat about the book with an AI assistant',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_chatWithBookBrainKey,\n        description: 'The BookBrain key for the book chat',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.tag_title,\n        name: 'Title',\n        description: 'The title of the book',\n        maxCount: 2,\n        jsonKey: 'title|multi(count=2, key=subtitle)',\n        exportJsonKey: [{ '@level=1': { title: '$' } }, { '@level=2': { subtitle: '$' } }],\n        // PLAN-141 F5 (NISO import): the PRIMARY (first) <title-wrap>'s\n        // assembled <full> title → [#]; the per-language extras drop (R-4).\n        mappingKeys: {\n          'xml-niso-iec': [\n            {\n              predicates: [],\n              maxEmits: 1,\n              rule: { '@el': 'title-wrap', '@children': { '@el': 'full', '@text': '$' } },\n            },\n          ],\n        },\n      },\n      {\n        key: ConfigKey.property_subtype,\n        description: 'The subtype of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_coverImage,\n        description: 'The cover image(s) of the book',\n        format: TagFormat.plainText,\n        nullable: true,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.resource_coverImage,\n        jsonKey: 'coverImage|resource(type=image, key=image)',\n        exportJsonKey: { coverImage: { type: 'image', image: { src: '$' } } },\n        description: 'The cover image of the book',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the cover image resource',\n          },\n        ],\n      },\n      {\n        key: ConfigKey.property_backgroundImage,\n        description: 'The background image(s) of the book',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.resource_backgroundImage,\n        jsonKey: 'backgroundImage|resource(type=image, key=image)',\n        exportJsonKey: { backgroundImage: { type: 'image', image: { src: '$' } } },\n        description: 'The background image of the book',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the background image resource',\n          },\n        ],\n      },\n      {\n        key: ConfigKey.property_coverColor,\n        description: 'The cover color of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_subject,\n        description: 'The subject(s) of the book',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_author,\n        description: 'The author(s) of the book',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_publications,\n        description: 'The publication(s) of the book',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_relatedBook,\n        description: 'Books related to this book',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_translationOfBook,\n        description: 'External Id of the translated book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_userFeedbackTranslationUrl,\n        description: 'URL to an external feedback form for book translation feedback',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_userFeedbackContentUrl,\n        description: 'URL to an external feedback form for book content feedback',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_duration,\n        description: 'The duration of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_maxTocChapterLevel,\n        description: 'The maximum table of contents chapter level',\n        format: TagFormat.number,\n        defaultValue: '-1',\n      },\n      {\n        key: ConfigKey.property_sourceDocument,\n        description: 'Url of the source document for the book (for example, a PDF file)',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_internalPrintPdf,\n        description: 'Url of the internal print PDF for the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_allowPrint,\n        description: 'If true, the book allows printing',\n        format: TagFormat.enumeration,\n        values: ['enforceFalse', 'enforceTrue', 'useSpaceConfiguration'],\n        defaultValue: 'useSpaceConfiguration',\n      },\n      {\n        key: ConfigKey.property_hasPrintRestriction,\n        description: 'If true, the book has print restrictions',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n      {\n        key: ConfigKey.property_enforceUpdateOverUserInput,\n        description: 'If true, prioritize new content over legacy content from the instance API',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_extractorExtractionTimestamp,\n        description: 'Extraction timestamps for book conversion',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n    ],\n  },\n  [ConfigKey.group_learningPathCommon]: {\n    type: GroupConfigType.standard,\n    description: 'Common learning path tags',\n    tags: [\n      {\n        key: ConfigKey.property_action,\n        description: 'The action for the learning path',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_duration,\n        description: 'The duration of the learning path',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_date,\n        description: 'The date of the learning path',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_dateEnd,\n        description: 'The end date of the learning path',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_location,\n        description: 'The location of the learning path',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_list,\n        description: 'The list of items in the learning path',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_textReference,\n        description: 'The text reference for the learning path',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_isTracked,\n        description: 'If true, the learning path is tracked',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n      {\n        key: ConfigKey.property_isInfoOnly,\n        description: 'If true, the learning path is info only',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_deeplink,\n        description: 'The deeplink(s) for the learning path',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'The caption for the button of the learning path',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_book,\n        description: 'The book(s) associated with the learning path',\n        format: TagFormat.plainText,\n        chain: [\n          {\n            exportJsonKey: { reference: '$' },\n            key: ConfigKey.tag_reference,\n            format: TagFormat.plainText,\n            description: 'The reference for the book(s) in the learning path',\n            maxCount: 1,\n            chain: [\n              {\n                key: ConfigKey.tag_reference,\n                jsonKey: 'referenceEnd',\n                exportJsonKey: { referenceEnd: '$' },\n                format: TagFormat.plainText,\n                description: 'The referenceEnd for the book(s) in the learning path',\n                maxCount: 1,\n              },\n            ],\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_advertisingCommon]: {\n    type: GroupConfigType.standard,\n    description: 'Common advertising tags',\n    tags: [\n      {\n        key: ConfigKey.property_advertisingClickUrl,\n        description: 'The URL to which the advertisement should link',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [ConfigKey.group_platformStylesCommon]: {\n    type: GroupConfigType.standard,\n    description: 'Common platform styles',\n    tags: [\n      {\n        key: ConfigKey.property_platformPrimaryColor,\n        description: 'The platform system primary color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformSecondaryColor,\n        description: 'The platform section secondary color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformBackgroundColor,\n        description: 'The platform system background color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformButtonPrimaryColor,\n        description: 'The platform section header button primary color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformButtonBackgroundColor,\n        description: 'The platform section header button background color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformScrollbarColor,\n        description: 'The platform main scrollbar color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformSelectionColor,\n        description: 'The platform main selection color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformTextSelectionColor,\n        description: 'The platform main input text selection color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformSeparatorColor,\n        description: 'The platform main separator color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformPlaceholderColor,\n        description: 'The platform main input placeholder color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformMessageBackgroundColor,\n        description: 'The platform section chat message background color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformBorderColor,\n        description: 'The platform border color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformSelectionTextColor,\n        description: 'The platform selection text color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformBaseLayerColor,\n        description: 'The platform base layer color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_platformMargin,\n        description: 'The platform margin',\n        format: TagFormat.number,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_platformBorderRadius,\n        description: 'The platform border radius',\n        format: TagFormat.number,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_platformSelectionBorderRadius,\n        description: 'The platform selection border radius',\n        format: TagFormat.number,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_platformNeedsShadow,\n        description: 'If true, the platform needs shadow',\n        format: TagFormat.boolean,\n        nullable: true,\n      },\n    ],\n  },\n  [ConfigKey.group_quizCommon]: {\n    type: GroupConfigType.standard,\n    description: 'Common quiz tags',\n    tags: [\n      {\n        key: ConfigKey.property_revealSolutions,\n        description: 'If true, the quiz solutions are revealed',\n        format: TagFormat.boolean,\n        nullable: true,\n        // defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_additionalSolutions,\n        description: 'Additional solutions',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n    ],\n  },\n  [ConfigKey.group_backgroundWallpaper]: {\n    type: GroupConfigType.standard,\n    description: 'Background wallpaper tags',\n    tags: [\n      {\n        key: ConfigKey.resource_backgroundWallpaper,\n        exportJsonKey: { backgroundWallpaper: { type: 'image', image: { src: '$' } } },\n        description: 'Background wallpaper for the image, used to set a background for the image',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common resource image tags for images',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_imageNoZoom]: {\n    type: GroupConfigType.standard,\n    description: 'Image bit tags',\n    tags: [\n      {\n        key: ConfigKey.group_backgroundWallpaper,\n        description:\n          'Background wallpaper tags for images, used to define background properties for images',\n      },\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description:\n          'Resource bit tags for images, used to define additional properties for images',\n      },\n      {\n        key: ConfigKey.group_resourceImageNoZoom,\n        description: 'Resource image tags for images, used to attach images to the bit',\n        minCount: 1,\n      },\n    ],\n  },\n  //\n  // Resource groups\n  //\n  [ConfigKey.group_resourceBitTags]: {\n    type: GroupConfigType.standard,\n    description: 'Resource bit tags',\n    tags: [\n      {\n        key: ConfigKey.resource_imagePlaceholder,\n        jsonKey: 'imagePlaceholder|resource(type=image, key=image)',\n        exportJsonKey: { imagePlaceholder: { type: 'image', image: { src: '$' } } },\n        description: 'Placeholder image for the resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the placeholder image',\n          },\n        ],\n        maxCount: 1,\n      },\n    ],\n  },\n  //\n  // Common resource properties\n  //\n  [ConfigKey.group_resourceCommon]: {\n    type: GroupConfigType.standard,\n    description: 'Common resource properties',\n    tags: [\n      {\n        key: ConfigKey.property_license,\n        description: 'The license for the resource',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_copyright,\n        description: 'The copyright information for the resource',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_caption,\n        description: 'The caption for the resource',\n        format: TagFormat.bitmarkText,\n        // PLAN-141 F1 (NISO import): a figure's <caption><title> — the\n        // nested content slot reads the title text; the caption rides the\n        // resource chain ([&image:…][@caption:…], catalog D5).\n        mappingKeys: {\n          'xml-niso-iec': { '@el': 'caption', '@children': { '@el': 'title', '@text': '$' } },\n        },\n      },\n      {\n        key: ConfigKey.property_showInIndex,\n        description: 'If true, the resource is shown in the index',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_search,\n        description: 'The search text for the resource',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_selected,\n        description: 'If true, the resource is selected',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_srcAlt,\n        description: 'An alternative source for the resource',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n    ],\n  },\n  [ConfigKey.group_resourceImageCommon]: {\n    type: GroupConfigType.standard,\n    description: 'Common properties for image resources',\n    tags: [\n      {\n        key: ConfigKey.group_resourceCommon,\n        description: 'Common resource properties',\n      },\n      {\n        key: ConfigKey.property_src1x,\n        description: 'The source URL for the image at 1x resolution',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_src2x,\n        description: 'The source URL for the image at 2x resolution',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_src3x,\n        description: 'The source URL for the image at 3x resolution',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_src4x,\n        description: 'The source URL for the image at 4x resolution',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_width,\n        description: 'The width of the image',\n        format: TagFormat.number,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_height,\n        description: 'The height of the image',\n        format: TagFormat.number,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_alt,\n        description: 'The alternative text for the image',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_zoomDisabled,\n        description: 'If true, zooming is disabled for the image',\n        format: TagFormat.boolean,\n      },\n    ],\n  },\n  [ConfigKey.group_resourceImageCommonNoZoom]: {\n    type: GroupConfigType.standard,\n    description: 'Common properties for image resources where @zoomDisabled defaults to true',\n    tags: [\n      {\n        key: ConfigKey.group_resourceCommon,\n        description: 'Common resource properties',\n      },\n      {\n        key: ConfigKey.property_src1x,\n        description: 'The source URL for the image at 1x resolution',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_src2x,\n        description: 'The source URL for the image at 2x resolution',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_src3x,\n        description: 'The source URL for the image at 3x resolution',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_src4x,\n        description: 'The source URL for the image at 4x resolution',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_width,\n        description: 'The width of the image',\n        format: TagFormat.number,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_height,\n        description: 'The height of the image',\n        format: TagFormat.number,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_alt,\n        description: 'The alternative text for the image',\n        format: TagFormat.plainText,\n      },\n      // @zoomDisabled with a true default\n      {\n        key: ConfigKey.property_zoomDisabled,\n        description: 'If true, zooming is disabled for the image (defaults to true)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [ConfigKey.group_resourceAudioCommon]: {\n    type: GroupConfigType.standard,\n    description: 'Common properties for audio resources',\n    tags: [\n      {\n        key: ConfigKey.group_resourceCommon,\n        description: 'Common resource properties',\n      },\n      {\n        key: ConfigKey.property_duration,\n        description: 'The duration of the audio resource',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_mute,\n        description: 'If true, the audio is muted',\n        format: TagFormat.boolean,\n      },\n      {\n        key: ConfigKey.property_autoplay,\n        description: 'If true, the audio plays automatically',\n        format: TagFormat.boolean,\n      },\n    ],\n  },\n  [ConfigKey.group_resourceVideoCommon]: {\n    type: GroupConfigType.standard,\n    description: 'Common properties for video resources',\n    tags: [\n      {\n        key: ConfigKey.group_resourceCommon,\n        description: 'Common resource properties',\n      },\n      {\n        key: ConfigKey.property_width,\n        description: 'The width of the video',\n        format: TagFormat.number,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_height,\n        description: 'The height of the video',\n        format: TagFormat.number,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_duration,\n        description: 'The duration of the video',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_mute,\n        description: 'If true, the video is muted',\n        format: TagFormat.boolean,\n      },\n      {\n        key: ConfigKey.property_autoplay,\n        description: 'If true, the video plays automatically',\n        format: TagFormat.boolean,\n      },\n      {\n        key: ConfigKey.property_allowSubtitles,\n        description: 'If true, subtitles are allowed for the video',\n        format: TagFormat.boolean,\n      },\n      {\n        key: ConfigKey.property_showSubtitles,\n        description: 'If true, subtitles are shown in the video',\n        format: TagFormat.boolean,\n      },\n      {\n        key: ConfigKey.property_alt,\n        description: 'The alternative text for the video',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_posterImage,\n        jsonKey: 'posterImage.src',\n        exportJsonKey: { posterImage: { src: '$' } },\n        description: 'The poster image for the video',\n        format: TagFormat.plainText,\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the poster image',\n          },\n        ],\n      },\n      {\n        key: ConfigKey.property_src1x,\n        description: 'The source URL for the video at 1x resolution',\n        format: TagFormat.plainText,\n        exportJsonKey: { thumbnails: [{ src: '$' }] },\n      },\n      {\n        key: ConfigKey.property_src2x,\n        description: 'The source URL for the video at 2x resolution',\n        format: TagFormat.plainText,\n        exportJsonKey: { thumbnails: [{ src: '$' }] },\n      },\n      {\n        key: ConfigKey.property_src3x,\n        description: 'The source URL for the video at 3x resolution',\n        format: TagFormat.plainText,\n        exportJsonKey: { thumbnails: [{ src: '$' }] },\n      },\n      {\n        key: ConfigKey.property_src4x,\n        description: 'The source URL for the video at 4x resolution',\n        format: TagFormat.plainText,\n        exportJsonKey: { thumbnails: [{ src: '$' }] },\n      },\n    ],\n  },\n  //\n  // Single resources\n  //\n  [ConfigKey.group_resourceIcon]: {\n    type: GroupConfigType.standard,\n    description: 'Common properties for icon resources',\n    tags: [\n      {\n        key: ConfigKey.resource_icon,\n        exportJsonKey: { resource: { type: 'icon', icon: { src: '$' } } },\n        description: 'The icon resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the icon resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceImage]: {\n    type: GroupConfigType.resource,\n    description: 'Common properties for image resources',\n    tags: [\n      {\n        key: ConfigKey.resource_image,\n        exportJsonKey: { resource: { type: 'image', image: { src: '$' } } },\n        // PLAN-141 F1 (NISO import): the image URL rides the `$`-in-attr\n        // value slot — a <graphic xlink:href> child of the mapped bit\n        // element roots the [&image:URL] chain.\n        mappingKeys: { 'xml-niso-iec': { '@el': 'graphic', '@attr': { 'xlink:href': '$' } } },\n        description: 'The image resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the image resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceImageNoZoom]: {\n    type: GroupConfigType.resource,\n    description: 'Image resource where @zoomDisabled defaults to true',\n    tags: [\n      {\n        key: ConfigKey.resource_image,\n        exportJsonKey: { resource: { type: 'image', image: { src: '$' } } },\n        description: 'The image resource (no-zoom default)',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommonNoZoom,\n            description: 'Common image properties with @zoomDisabled defaulting to true',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceImagePortrait]: {\n    type: GroupConfigType.resource,\n    description: 'Portrait image resource',\n    tags: [\n      {\n        key: ConfigKey.resource_imagePortrait,\n        exportJsonKey: { resource: { type: 'image-portrait', imagePortrait: { src: '$' } } },\n        description: 'The portrait image resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the portrait image resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceImageLandscape]: {\n    type: GroupConfigType.resource,\n    description: 'Landscape image resource',\n    tags: [\n      {\n        key: ConfigKey.resource_imageLandscape,\n        exportJsonKey: { resource: { type: 'image-landscape', imageLandscape: { src: '$' } } },\n        description: 'The landscape image resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the landscape image resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceImageEmbed]: {\n    type: GroupConfigType.resource,\n    description: 'Embedded image resource',\n    tags: [\n      {\n        key: ConfigKey.resource_imageEmbed,\n        exportJsonKey: { resource: { type: 'image-embed', imageEmbed: { src: '$' } } },\n        description: 'The embedded image resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the embedded image resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceImageLink]: {\n    type: GroupConfigType.resource,\n    description: 'Link to an image resource',\n    tags: [\n      {\n        key: ConfigKey.resource_imageLink,\n        exportJsonKey: { resource: { type: 'image-link', imageLink: { url: '$' } } },\n        description: 'The link to the image resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the linked image resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceAudio]: {\n    type: GroupConfigType.resource,\n    description: 'Audio resource',\n    tags: [\n      {\n        key: ConfigKey.resource_audio,\n        exportJsonKey: { resource: { type: 'audio', audio: { src: '$' } } },\n        description: 'The audio resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceAudioCommon,\n            description: 'Common audio properties for the audio resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceAudioEmbed]: {\n    type: GroupConfigType.resource,\n    description: 'Embedded audio resource',\n    tags: [\n      {\n        key: ConfigKey.resource_audioEmbed,\n        exportJsonKey: { resource: { type: 'audio-embed', audioEmbed: { src: '$' } } },\n        description: 'The embedded audio resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceAudioCommon,\n            description: 'Common audio properties for the embedded audio resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceAudioLink]: {\n    type: GroupConfigType.resource,\n    description: 'Link to an audio resource',\n    tags: [\n      {\n        key: ConfigKey.resource_audioLink,\n        exportJsonKey: { resource: { type: 'audio-link', audioLink: { url: '$' } } },\n        description: 'The link to the audio resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceAudioCommon,\n            description: 'Common audio properties for the linked audio resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceVideo]: {\n    type: GroupConfigType.resource,\n    description: 'Video resource',\n    tags: [\n      {\n        key: ConfigKey.resource_video,\n        exportJsonKey: { resource: { type: 'video', video: { src: '$' } } },\n        description: 'The video resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceVideoCommon,\n            description: 'Common video properties for the video resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceVideoEmbed]: {\n    type: GroupConfigType.resource,\n    description: 'Embedded video resource',\n    tags: [\n      {\n        key: ConfigKey.resource_videoEmbed,\n        exportJsonKey: { resource: { type: 'video-embed', videoEmbed: { url: '$' } } },\n        description: 'The embedded video resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceVideoCommon,\n            description: 'Common video properties for the embedded video resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceVideoLink]: {\n    type: GroupConfigType.resource,\n    description: 'Link to a video resource',\n    tags: [\n      {\n        key: ConfigKey.resource_videoLink,\n        exportJsonKey: { resource: { type: 'video-link', videoLink: { url: '$' } } },\n        description: 'The link to the video resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceVideoCommon,\n            description: 'Common video properties for the linked video resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceStillImageFilmEmbed]: {\n    type: GroupConfigType.resource,\n    description: 'Embedded still image film resource',\n    tags: [\n      {\n        key: ConfigKey.resource_stillImageFilmEmbed,\n        exportJsonKey: {\n          resource: { type: 'still-image-film-embed', stillImageFilmEmbed: { url: '$' } },\n        },\n        description: 'The embedded still image film resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceVideoCommon,\n            description: 'Common video properties for the embedded still image film resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceStillImageFilmLink]: {\n    type: GroupConfigType.resource,\n    description: 'Link to a still image film resource',\n    tags: [\n      {\n        key: ConfigKey.resource_stillImageFilmLink,\n        exportJsonKey: {\n          resource: { type: 'still-image-film-link', stillImageFilmLink: { url: '$' } },\n        },\n        description: 'The link to the still image film resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceVideoCommon,\n            description: 'Common video properties for the linked still image film resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceArticle]: {\n    type: GroupConfigType.resource,\n    description: 'Article resource',\n    tags: [\n      {\n        key: ConfigKey.resource_article,\n        exportJsonKey: { resource: { type: 'article', article: { body: '$' } } },\n        description: 'The article resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceCommon,\n            description: 'Common resource properties for the article resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceArticleEmbed]: {\n    type: GroupConfigType.resource,\n    description: 'Embedded article resource',\n    tags: [\n      {\n        key: ConfigKey.resource_articleEmbed,\n        exportJsonKey: { resource: { type: 'article-embed', articleEmbed: { url: '$' } } },\n        description: 'The embedded article resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceCommon,\n            description: 'Common resource properties for the embedded article resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceArticleLink]: {\n    type: GroupConfigType.resource,\n    description: 'Link to an article resource',\n    tags: [\n      {\n        key: ConfigKey.resource_articleLink,\n        exportJsonKey: { resource: { type: 'article-link', articleLink: { url: '$' } } },\n        description: 'The link to the article resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceCommon,\n            description: 'Common resource properties for the linked article resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceDocument]: {\n    type: GroupConfigType.resource,\n    description: 'Document resource',\n    tags: [\n      {\n        key: ConfigKey.resource_document,\n        exportJsonKey: { resource: { type: 'document', document: { url: '$' } } },\n        description: 'The document resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceCommon,\n            description: 'Common resource properties for the document resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceDocumentEmbed]: {\n    type: GroupConfigType.resource,\n    description: 'Embedded document resource',\n    tags: [\n      {\n        key: ConfigKey.resource_documentEmbed,\n        exportJsonKey: { resource: { type: 'document-embed', documentEmbed: { url: '$' } } },\n        description: 'The embedded document resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceCommon,\n            description: 'Common resource properties for the embedded document resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceDocumentLink]: {\n    type: GroupConfigType.resource,\n    description: 'Link to a document resource',\n    tags: [\n      {\n        key: ConfigKey.resource_documentLink,\n        exportJsonKey: { resource: { type: 'document-link', documentLink: { url: '$' } } },\n        description: 'The link to the document resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceCommon,\n            description: 'Common resource properties for the linked document resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceDocumentDownload]: {\n    type: GroupConfigType.resource,\n    description: 'Downloadable document resource',\n    tags: [\n      {\n        key: ConfigKey.resource_documentDownload,\n        exportJsonKey: { resource: { type: 'document-download', documentDownload: { url: '$' } } },\n        description: 'The downloadable document resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceCommon,\n            description: 'Common resource properties for the downloadable document resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceAppLink]: {\n    type: GroupConfigType.resource,\n    description: 'Link to an app resource',\n    tags: [\n      {\n        key: ConfigKey.resource_appLink,\n        exportJsonKey: { resource: { type: 'app-link', appLink: { url: '$' } } },\n        description: 'The link to the app resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceCommon,\n            description: 'Common resource properties for the linked app resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_resourceWebsiteLink]: {\n    type: GroupConfigType.resource,\n    description: 'Link to a website resource',\n    tags: [\n      {\n        key: ConfigKey.resource_websiteLink,\n        exportJsonKey: { resource: { type: 'website-link', websiteLink: { url: '$' } } },\n        description: 'The link to the website resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceCommon,\n            description: 'Common resource properties for the linked website resource',\n          },\n        ],\n      },\n    ],\n  },\n  //\n  // Combo resources - these are resources made up of a combination of multiple resources.\n  //\n  [ConfigKey.group_resourceStillImageFilm]: {\n    type: GroupConfigType.comboResource,\n    description: 'Resource for still image film',\n    comboResourceConfigKey: ConfigKey.resource_stillImageFilm,\n    tags: [\n      {\n        key: ConfigKey.group_resourceImage,\n        description: 'The image resource for the still image film',\n        maxCount: 1,\n        minCount: 1,\n      },\n      {\n        key: ConfigKey.group_resourceAudio,\n        description: 'The audio resource for the still image film',\n        maxCount: 1,\n        minCount: 1,\n      },\n    ],\n  },\n  [ConfigKey.group_resourceImageResponsive]: {\n    type: GroupConfigType.comboResource,\n    description: 'Responsive image resource',\n    comboResourceConfigKey: ConfigKey.resource_imageResponsive,\n    tags: [\n      {\n        key: ConfigKey.group_resourceImagePortrait,\n        description: 'The portrait image resource',\n        maxCount: 1,\n        minCount: 1,\n      },\n      {\n        key: ConfigKey.group_resourceImageLandscape,\n        description: 'The landscape image resource',\n        maxCount: 1,\n        minCount: 1,\n      },\n    ],\n  },\n  [ConfigKey.group_previewImages]: {\n    type: GroupConfigType.resource,\n    description: 'Array of preview images for catalog items',\n    tags: [\n      {\n        key: ConfigKey.resource_previewImage,\n        jsonKey: 'previewImage|resource(type=image, key=image)',\n        exportJsonKey: { previewImage: { type: 'image', image: { src: '$' } } },\n        description: 'The preview image resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the image resource',\n          },\n        ],\n      },\n    ],\n  },\n  [ConfigKey.group_previewVideos]: {\n    type: GroupConfigType.resource,\n    description: 'Array of preview videos for catalog items',\n    tags: [\n      {\n        key: ConfigKey.resource_previewVideo,\n        jsonKey: 'previewVideo|resource(type=video, key=video)',\n        exportJsonKey: { previewVideo: { type: 'video', video: { src: '$' } } },\n        description: 'The preview video resource',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the image resource',\n          },\n        ],\n      },\n    ],\n  },\n};\n\nexport { GROUPS };\n","import { type _BitsConfig } from '../../model/config/_Config.ts';\nimport { CardSetConfigKey } from '../../model/config/enum/CardSetConfigKey.ts';\nimport { ConfigKey } from '../../model/config/enum/ConfigKey.ts';\nimport { BitType } from '../../model/enum/BitType.ts';\nimport { Count } from '../../model/enum/Count.ts';\nimport { ExampleType } from '../../model/enum/ExampleType.ts';\nimport { TagFormat } from '../../model/enum/TagFormat.ts';\nimport { TextFormat } from '../../model/enum/TextFormat.ts';\n\nconst BITS: _BitsConfig = {\n  [BitType._error]: {\n    since: '1.3.0',\n    description: 'An error bit, rendered when the bit cannot be interpreted',\n  },\n\n  [BitType._comment]: {\n    since: '1.4.12',\n    description:\n      'A comment bit, used when a bit is commented out by adding | between the . and the bit name, e.g [.|article]',\n  },\n\n  [BitType._standard]: {\n    since: '3.2.0',\n    description:\n      'The standard bit type, used as a base for other bits, should not be used directly',\n    tags: [\n      {\n        key: ConfigKey.group_standardTags,\n        description: 'Standard tags for (almost) all bits',\n      },\n    ],\n  },\n\n  [BitType.appFlashcards]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'App flashcards bit, used for flashcard quizzes in the app',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common tags for quiz bits',\n      },\n      {\n        maxCount: 2,\n        jsonKey: 'title|multi(count=2, key=subtitle)',\n        exportJsonKey: [{ '@level=1': { title: '$' } }, { '@level=2': { subtitle: '$' } }],\n        key: ConfigKey.tag_title,\n        description: 'The title of the flashcard quiz',\n      },\n      {\n        key: ConfigKey.property_flashcardSet,\n        description: 'The flashcard set to use for the app flashcards',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        // Override inherited @example from group_standardTags: string root\n        // example. Bare/synthesized emits `example: \"true\"` (a text literal\n        // that field-coerces to a paragraph \"true\" in bitmark+ contexts);\n        // valued [@example:text] emits the user's text via `$`.\n        key: ConfigKey.property_example,\n        exportJsonKey: [\n          { '@keyonly': { isExample: true, example: 'true' } },\n          { '@absent': { isExample: true, example: 'true' } },\n          { isExample: true, example: '$' },\n        ],\n        description: 'The example text for the bit',\n        format: TagFormat.plainText,\n        nullable: true,\n      },\n    ],\n    rootExampleType: ExampleType.string,\n  },\n  [BitType.appFlashcardsQuiz]: {\n    since: '1.3.0',\n    baseBitType: BitType.appFlashcards,\n    description: 'App flashcards quiz bit',\n  },\n  [BitType.appFlashcardsLearn]: {\n    since: '1.3.0',\n    baseBitType: BitType.appFlashcards,\n    description: 'App flashcards learn bit',\n  },\n  [BitType.appLink]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'App link bit, used to link to other bits in the app',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Tags for the resource bit',\n      },\n      {\n        key: ConfigKey.group_resourceAppLink,\n        description: 'Tags for the app link resource',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.appRag]: {\n    since: '5.14.0',\n    baseBitType: BitType.article,\n    description: 'App RAG (Retrieval-Augmented Generation) bit, equal to article',\n  },\n  [BitType.appSearch]: {\n    since: '5.14.0',\n    baseBitType: BitType.article,\n    description: 'App search bit, equal to article',\n  },\n  [BitType.author]: {\n    since: '4.2.0',\n    baseBitType: BitType._standard,\n    description: 'Represents an author of something',\n    tags: [\n      {\n        key: ConfigKey.property_fullName,\n        description: 'Full name of the author',\n      },\n      {\n        key: ConfigKey.property_pseudonym,\n        description: 'A pseudonym of the author, if any',\n      },\n      {\n        key: ConfigKey.property_title,\n        description: 'The title of the author, e.g. \"Dr.\", \"Prof.\", etc.',\n        jsonKey: 'title',\n      },\n      {\n        key: ConfigKey.property_jobTitle,\n        description: 'The job title of the author, e.g. \"Software Engineer\", \"Professor\", etc.',\n      },\n    ],\n  },\n  [BitType.bookAuthor]: {\n    since: '4.2.0',\n    baseBitType: BitType.author,\n    description: 'Represents an author of a book',\n  },\n  [BitType.articleAuthor]: {\n    since: '4.2.0',\n    baseBitType: BitType.author,\n    description: 'Represents an author of a book',\n  },\n  [BitType.article]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Article bit, used for articles / paragraphs',\n    tags: [\n      {\n        maxCount: 2,\n        jsonKey: 'title|multi(count=2, key=subtitle)',\n        exportJsonKey: [{ '@level=1': { title: '$' } }, { '@level=2': { subtitle: '$' } }],\n        // PLAN-140 W3 (NISO import): the title of a mapped source element.\n        mappingKeys: { 'xml-niso-iec': { '@el': 'title', '@text': '$' } },\n        key: ConfigKey.tag_title,\n        description: 'The title of the article',\n      },\n    ],\n  },\n  [BitType.articleAlt]: {\n    since: '1.15.0',\n    baseBitType: BitType.article,\n    description: 'Alternative article bit',\n  },\n  [BitType.articleResponsive]: {\n    since: '1.21.0',\n    baseBitType: BitType.article,\n    description: 'Responsive article bit, used for articles that adapt to the screen size',\n    tags: [\n      {\n        key: ConfigKey.property_imageFirst,\n        description: 'If the image should be displayed first in the responsive article',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.articleResponsiveAlt]: {\n    since: '2.0.0',\n    baseBitType: BitType.articleResponsive,\n    description: 'Alternative responsive article bit',\n  },\n  [BitType.standardArticleNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.article,\n    description: 'Standard normative article bit',\n  },\n  [BitType.standardArticleNonNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.article,\n    description: 'Standard non-normative article bit',\n  },\n  [BitType.smartStandardArticleNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardArticleNormative,\n    description: 'Smart standard normative article bit',\n    // PLAN-140 W3 (NISO import, tranche 1): one article bit per NISO\n    // paragraph (catalog D1). CONTENT keys (@children): the subtree is the\n    // bit's body; nothing inside it promotes. (Ancestor-context normativity\n    // is the non-normative sibling's @ancestor key — plan Q4, resolved.)\n    //\n    // Second rule (catalog D1 push-down): a NUMBERED-PARAGRAPH sec is an\n    // article, not a chapter — the sec-type literal outranks the chapter\n    // key's plain sec|app rule (most-specific-wins). Content key: the sec's\n    // label rides [%] via the label tag key, its inner <p> is the body, its\n    // id is the bit's customerId, and the anchor slot marks it\n    // anchor-bearing.\n    mappingKeys: {\n      'xml-niso-iec': [\n        { '@el': 'p', '@attr': { id: '$customerId' }, '@children': '$' },\n        {\n          '@el': 'sec',\n          '@attr': { 'sec-type': 'numbered-paragraph', id: '$customerId' },\n          '@children': '$',\n          '▼': '$anchor',\n        },\n      ],\n    },\n  },\n  [BitType.smartStandardArticleNonNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardArticleNonNormative,\n    description: 'Smart standard non-normative article bit',\n    // PLAN-140 Q4 (normativity inheritance): a <p> is non-normative because\n    // of an ANCESTOR element — a foreword/intro sec or an informative annex.\n    // @ancestor is a reverse-match-only constraint (forward emission ignores\n    // it); the rules are alternatives, first-satisfied wins, and the\n    // @ancestor literals give this key higher specificity than the plain\n    // normative-article <p> key wherever the context applies.\n    mappingKeys: {\n      'xml-niso-iec': [\n        {\n          '@el': 'p',\n          '@attr': { id: '$customerId' },\n          '@ancestor': { '@attr': { 'sec-type': 'foreword|intro' } },\n          '@children': '$',\n        },\n        {\n          '@el': 'p',\n          '@attr': { id: '$customerId' },\n          '@ancestor': { '@attr': { 'content-type': 'informative' } },\n          '@children': '$',\n        },\n      ],\n    },\n  },\n  [BitType.smartStandardArticleNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardArticleNormative,\n    description: 'Smart standard normative article bit that is collapsible',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.smartStandardArticleNonNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardArticleNonNormative,\n    description: 'Smart standard non-normative article bit that is collapsible',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.statement]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Statement bit, used for statements in documents',\n  },\n  [BitType.pageArticle]: {\n    since: '1.15.0',\n    baseBitType: BitType.article,\n    description: 'Page article bit',\n  },\n  [BitType.pageArticleAlt]: {\n    since: '1.15.0',\n    baseBitType: BitType.article,\n    description: 'Alternative page article bit',\n  },\n  [BitType.pageArticleResponsive]: {\n    since: '1.21.0',\n    baseBitType: BitType.article,\n    description: 'Responsive page article bit, used for articles that adapt to the screen size',\n    tags: [\n      {\n        key: ConfigKey.property_imageFirst,\n        description: 'If the image should be displayed first in the responsive article',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.buttonCopyText]: {\n    since: '1.4.3',\n    baseBitType: BitType.article,\n    description: 'Button copy text bit, used to create a button that copies text to the clipboard',\n    tags: [\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'The caption of the button',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.catalogItemBook]: {\n    since: '4.15.0',\n    baseBitType: BitType._standard,\n    description:\n      'Catalog item book bit, used to represent a book product in a catalog with cover and description',\n    tags: [\n      {\n        key: ConfigKey.tag_title,\n        description: 'Title and subtitle of the catalog item',\n        maxCount: 2,\n        jsonKey: 'title|multi(count=2, key=subtitle)',\n        exportJsonKey: [{ '@level=1': { title: '$' } }, { '@level=2': { subtitle: '$' } }],\n      },\n      {\n        key: ConfigKey.property_coverImage,\n        description: 'Cover image of the catalog item',\n        format: TagFormat.plainText,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.resource_coverImage,\n        jsonKey: 'coverImage|resource(type=image, key=image)',\n        exportJsonKey: { coverImage: { type: 'image', image: { src: '$' } } },\n        description: 'Cover image of the catalog item',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the cover image resource',\n          },\n        ],\n      },\n      {\n        key: ConfigKey.property_content2Buy,\n        description: 'Content to buy identifier',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_listPrice,\n        description: 'List price of the catalog item',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'Caption for the buy button',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_customerProductId,\n        description: 'Customer-specific product identifier',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_currency,\n        description: 'Currency for the catalog item',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookIsbn,\n        description: 'ISBN for iBook version',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookAuthor,\n        description: 'Author of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookType,\n        description: 'Type of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookBindingType,\n        description: 'Binding type of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookNumberOfPages,\n        description: 'Number of pages in the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookRating,\n        description: 'Rating of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookSeriesTitle,\n        description: 'Title of the book series',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookSeriesId,\n        description: 'ID of the book series',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookSeriesNumber,\n        description: 'Number in the book series',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookLanguage,\n        description: 'Language of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookPublishingDate,\n        description: 'Publishing date of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookPublisher,\n        description: 'Publisher of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookTranslator,\n        description: 'Translator of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookOriginalTitle,\n        description: 'Original title of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_gmbExternalShop,\n        description: 'External shop identifier',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_gmbExternalShopItems,\n        description: 'Array of external shop items',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.group_imageSource,\n        description: 'Image source chain',\n      },\n      {\n        key: ConfigKey.group_previewImages,\n        description: 'Array of preview images for the catalog item',\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.group_previewVideos,\n        description: 'Array of preview videos for the catalog item',\n        maxCount: Count.infinity,\n      },\n      {\n        // Override inherited @example from group_standardTags: string root example.\n        key: ConfigKey.property_example,\n        exportJsonKey: [\n          { '@keyonly': { isExample: true, example: 'true' } },\n          { '@absent': { isExample: true, example: 'true' } },\n          { isExample: true, example: '$' },\n        ],\n        description: 'The example text for the bit',\n        format: TagFormat.plainText,\n        nullable: true,\n      },\n    ],\n    rootExampleType: ExampleType.string,\n  },\n  [BitType.catalogItemExternalBook]: {\n    since: '4.15.0',\n    baseBitType: BitType._standard,\n    description:\n      'Catalog item external book bit, used to represent an external book product in a catalog with link to external shop',\n    tags: [\n      {\n        key: ConfigKey.tag_title,\n        description: 'Title and subtitle of the catalog item',\n        maxCount: 2,\n        jsonKey: 'title|multi(count=2, key=subtitle)',\n        exportJsonKey: [{ '@level=1': { title: '$' } }, { '@level=2': { subtitle: '$' } }],\n      },\n      {\n        key: ConfigKey.property_coverImage,\n        description: 'Cover image of the catalog item',\n        format: TagFormat.plainText,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.resource_coverImage,\n        jsonKey: 'coverImage|resource(type=image, key=image)',\n        exportJsonKey: { coverImage: { type: 'image', image: { src: '$' } } },\n        description: 'Cover image of the catalog item',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the cover image resource',\n          },\n        ],\n      },\n      {\n        key: ConfigKey.property_customerProductShopLink,\n        description: 'Link to external shop for the product',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_listPrice,\n        description: 'List price of the catalog item',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'Caption for the buy button',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_customerProductId,\n        description: 'Customer-specific product identifier',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_currency,\n        description: 'Currency for the catalog item',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookIsbn,\n        description: 'ISBN for iBook version',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookAuthor,\n        description: 'Author of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookType,\n        description: 'Type of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookBindingType,\n        description: 'Binding type of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookNumberOfPages,\n        description: 'Number of pages in the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookRating,\n        description: 'Rating of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookSeriesTitle,\n        description: 'Title of the book series',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookSeriesId,\n        description: 'ID of the book series',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookSeriesNumber,\n        description: 'Number in the book series',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookLanguage,\n        description: 'Language of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookPublishingDate,\n        description: 'Publishing date of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookPublisher,\n        description: 'Publisher of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookTranslator,\n        description: 'Translator of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookOriginalTitle,\n        description: 'Original title of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_gmbExternalShop,\n        description: 'External shop identifier',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_gmbExternalShopItems,\n        description: 'Array of external shop items',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.group_imageSource,\n        description: 'Image source chain',\n      },\n      {\n        key: ConfigKey.group_previewImages,\n        description: 'Array of preview images for the catalog item',\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.group_previewVideos,\n        description: 'Array of preview videos for the catalog item',\n        maxCount: Count.infinity,\n      },\n      {\n        // Override inherited @example from group_standardTags: string root example.\n        key: ConfigKey.property_example,\n        exportJsonKey: [\n          { '@keyonly': { isExample: true, example: 'true' } },\n          { '@absent': { isExample: true, example: 'true' } },\n          { isExample: true, example: '$' },\n        ],\n        description: 'The example text for the bit',\n        format: TagFormat.plainText,\n        nullable: true,\n      },\n    ],\n    rootExampleType: ExampleType.string,\n  },\n  [BitType.catalogItemProduct]: {\n    since: '4.15.0',\n    baseBitType: BitType._standard,\n    description:\n      'Catalog item product bit, used to represent a general product in a catalog with cover and description',\n    tags: [\n      {\n        key: ConfigKey.tag_title,\n        description: 'Title and subtitle of the catalog item',\n        maxCount: 2,\n        jsonKey: 'title|multi(count=2, key=subtitle)',\n        exportJsonKey: [{ '@level=1': { title: '$' } }, { '@level=2': { subtitle: '$' } }],\n      },\n      {\n        key: ConfigKey.property_coverImage,\n        description: 'Cover image of the catalog item',\n        format: TagFormat.plainText,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_content2Buy,\n        description: 'Content to buy identifier',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_listPrice,\n        description: 'List price of the catalog item',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'Caption for the buy button',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_customerProductId,\n        description: 'Customer-specific product identifier',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_currency,\n        description: 'Currency for the catalog item',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookIsbn,\n        description: 'ISBN for iBook version',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookAuthor,\n        description: 'Author of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookType,\n        description: 'Type of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookBindingType,\n        description: 'Binding type of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookNumberOfPages,\n        description: 'Number of pages in the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookRating,\n        description: 'Rating of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookSeriesTitle,\n        description: 'Title of the book series',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookSeriesId,\n        description: 'ID of the book series',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookSeriesNumber,\n        description: 'Number in the book series',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookLanguage,\n        description: 'Language of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookPublishingDate,\n        description: 'Publishing date of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookPublisher,\n        description: 'Publisher of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookTranslator,\n        description: 'Translator of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_bookOriginalTitle,\n        description: 'Original title of the book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_gmbExternalShop,\n        description: 'External shop identifier',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_gmbExternalShopItems,\n        description: 'Array of external shop items',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.group_imageSource,\n        description: 'Image source chain',\n      },\n      {\n        key: ConfigKey.group_previewImages,\n        description: 'Array of preview images for the catalog item',\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.group_previewVideos,\n        description: 'Array of preview videos for the catalog item',\n        maxCount: Count.infinity,\n      },\n      {\n        // Override inherited @example from group_standardTags: string root example.\n        key: ConfigKey.property_example,\n        exportJsonKey: [\n          { '@keyonly': { isExample: true, example: 'true' } },\n          { '@absent': { isExample: true, example: 'true' } },\n          { isExample: true, example: '$' },\n        ],\n        description: 'The example text for the bit',\n        format: TagFormat.plainText,\n        nullable: true,\n      },\n    ],\n    rootExampleType: ExampleType.string,\n  },\n  [BitType.callToAction]: {\n    since: '1.15.0',\n    baseBitType: BitType._standard,\n    description: 'Call to action bit, used to create a call to action button',\n    tags: [\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'The caption of the call to action button',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_callToActionUrl,\n        description: 'The URL to navigate to when the call to action button is clicked',\n        format: TagFormat.plainText,\n        minCount: 1,\n      },\n    ],\n  },\n  [BitType.callToActionSubscribe]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action subscribe bit',\n  },\n  [BitType.callToActionContact]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action contact bit',\n  },\n  [BitType.callToActionJoin]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action join bit',\n  },\n  [BitType.callToActionMail]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action mail bit',\n  },\n  [BitType.callToActionLearnMore]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action learn more bit',\n  },\n  [BitType.callToActionSeeMore]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action see more bit',\n  },\n  [BitType.callToActionWatch]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action watch bit',\n  },\n  [BitType.callToActionStartNow]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action start now bit',\n  },\n  [BitType.callToActionGetOffer]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action get offer bit',\n  },\n  [BitType.callToActionBookNow]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action book now bit',\n  },\n  [BitType.callToActionShopNow]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action shop now bit',\n  },\n  [BitType.callToActionGetNow]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action get now bit',\n  },\n  [BitType.callToActionDownload]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action download bit',\n  },\n  [BitType.callToActionCreateAccount]: {\n    since: '1.15.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call to action create account bit',\n  },\n  [BitType.appBitmarkFromJavascript]: {\n    since: '1.4.5',\n    baseBitType: BitType._standard,\n    description: 'App bitmark from JavaScript, used to create bits from JavaScript in the app',\n    tags: [\n      {\n        key: ConfigKey.property_maxCreatedBits,\n        description: 'The maximum number of bits that can be created from this bit',\n        format: TagFormat.number,\n        nullable: true,\n      },\n    ],\n    textFormatDefault: TextFormat.plainText,\n  },\n  [BitType.appBitmarkFromEditor]: {\n    since: '1.4.5',\n    baseBitType: BitType.appBitmarkFromJavascript,\n    description: 'App bitmark from editor, used to create bits from the editor in the app',\n  },\n  [BitType.articleEmbed]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Article embed bit, used to embed articles from other sources',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Tags for the resource bit',\n      },\n      {\n        key: ConfigKey.group_resourceArticleEmbed,\n        description: 'Tags for the article embed resource',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.articleLink]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Article link bit, used to link to articles from other sources',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Tags for the resource bit',\n      },\n      {\n        key: ConfigKey.group_resourceArticleLink,\n        description: 'Tags for the article link resource',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.audio]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Audio bit, used for audio files',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Tags for the resource bit',\n      },\n      {\n        key: ConfigKey.group_resourceAudio,\n        description: 'Tags for the audio resource',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.audioEmbed]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Audio embed bit, used to embed audio files from other sources',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Tags for the resource bit',\n      },\n      {\n        key: ConfigKey.group_resourceAudioEmbed,\n        description: 'Tags for the audio embed resource',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.audioLink]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Audio link bit, used to link to audio files from other sources',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Tags for the resource bit',\n      },\n      {\n        key: ConfigKey.group_resourceAudioLink,\n        description: 'Tags for the audio link resource',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.bitAlias]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Bit alias, used to create an alias for a bit',\n    tags: [\n      {\n        exportJsonKey: { reference: '$' },\n        key: ConfigKey.tag_reference,\n        format: TagFormat.plainText,\n        description: 'The reference to the bit that this alias points to',\n      },\n      {\n        exportJsonKey: { anchor: '$' },\n        key: ConfigKey.tag_anchor,\n        format: TagFormat.plainText,\n        description: 'The anchor for the bit alias, used for linking',\n      },\n    ],\n  },\n  [BitType.diff]: {\n    since: '3.13.0',\n    baseBitType: BitType._standard,\n    description: 'Diff bit, used to show differences between two bits',\n    tags: [\n      {\n        key: ConfigKey.property_diffTo,\n        description: 'The reference to the bit that this diff compares to',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.book]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Book bit, used to represent a book',\n    // PLAN-141 F5 (NISO import): the <std-meta> front-matter container is\n    // the [.book] bit (STRUCTURAL, first in document order): primary\n    // title-wrap → [#], primary content-language → [@language], dated\n    // std-ref → [@externalId] (tag keys with maxEmits caps — the NISO\n    // convention puts the document language first). std-meta has no id, so\n    // no anchor/customerId. Remaining leaves drop as recorded loss (R-4).\n    mappingKeys: { 'xml-niso-iec': { '@el': 'std-meta' } },\n    tags: [\n      {\n        key: ConfigKey.group_bookCommon,\n        description: 'Common tags for book bits',\n      },\n    ],\n  },\n  [BitType.bookEnd]: {\n    since: '3.27.0',\n    baseBitType: BitType.article,\n    description: 'End of book bit',\n  },\n  [BitType.bookAcknowledgements]: {\n    since: '1.17.0',\n    baseBitType: BitType.article,\n    description: 'Acknowledgements section of a book',\n  },\n  [BitType.bookAddendum]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Addendum section of a book',\n  },\n  [BitType.bookAfterword]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Afterword section of a book',\n  },\n  [BitType.bookAppendix]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Appendix section of a book',\n  },\n  [BitType.bookArticle]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Article section of a book',\n  },\n  [BitType.bookAutherBio]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Author biography section of a book',\n  },\n  [BitType.bookBibliography]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Bibliography section of a book',\n  },\n  [BitType.bookComingSoon]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Coming soon section of a book',\n  },\n  [BitType.bookConclusion]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Conclusion section of a book',\n  },\n  [BitType.bookCopyright]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Copyright section of a book',\n  },\n  [BitType.bookCopyrightPermissions]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Copyright permissions section of a book',\n  },\n  [BitType.bookDedication]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Dedication section of a book',\n  },\n  [BitType.bookEndnotes]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Endnotes section of a book',\n  },\n  [BitType.bookEpigraph]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Epigraph section of a book',\n  },\n  [BitType.bookEpilogue]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Epilogue section of a book',\n  },\n  [BitType.bookForword]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Foreword section of a book',\n  },\n  [BitType.bookFrontispiece]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Frontispiece section of a book',\n  },\n  [BitType.bookImprint]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Imprint section of a book',\n  },\n  [BitType.bookIncitingIncident]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Inciting incident section of a book',\n  },\n  [BitType.bookIntroduction]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Introduction section of a book',\n  },\n  [BitType.bookListOfContributors]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'List of contributors section of a book',\n  },\n  [BitType.bookNotes]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Notes section of a book',\n  },\n  [BitType.bookPostscript]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Postscript section of a book',\n  },\n  [BitType.bookPreface]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Preface section of a book',\n  },\n  [BitType.bookPrologue]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Prologue section of a book',\n  },\n  [BitType.bookReadMore]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Read more section of a book',\n  },\n  [BitType.bookReferenceList]: {\n    //\n    since: '3.2.0',\n    baseBitType: BitType._standard,\n    description: 'Book reference list, used to list references in a book',\n    cardSet: CardSetConfigKey.bookReferenceList,\n  },\n  [BitType.bookRequestForABookReview]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Request for a book review section of a book',\n  },\n  [BitType.bookSummary]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Summary section of a book',\n  },\n  [BitType.bookTeaser]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Teaser section of a book',\n  },\n  [BitType.bookTitle]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Title section of a book',\n  },\n  [BitType.bookCover]: {\n    since: '3.27.0',\n    baseBitType: BitType.image,\n    description: 'Cover image of a book',\n    tags: [\n      {\n        key: ConfigKey.tag_title,\n        description: 'The title of the book cover',\n        maxCount: 2, // title & subtitle\n        jsonKey: 'title|multi(count=2, key=subtitle)',\n        exportJsonKey: [{ '@level=1': { title: '$' } }, { '@level=2': { subtitle: '$' } }],\n      },\n      {\n        key: ConfigKey.property_coverColor,\n        description: 'The color of the book cover',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.bookAlias]: {\n    since: '1.4.3',\n    baseBitType: BitType.book,\n    description: 'Book alias, used to create an alias for a book',\n    tags: [\n      {\n        key: ConfigKey.property_bookAlias,\n        description: 'The alias for the book',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n    ],\n  },\n  [BitType.bookDiff]: {\n    since: '3.10.0',\n    baseBitType: BitType.book,\n    description: 'Book diff, used to show differences between two book versions',\n    tags: [\n      {\n        key: ConfigKey.property_bookDiff,\n        description: 'The reference to the book that this diff compares to',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.bookClose]: {\n    since: '1.18.0',\n    baseBitType: BitType.article,\n    description: 'Close section of a book, used to close the book',\n    tags: [\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'The caption of the close button',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.bookReference]: {\n    since: '2.2.0',\n    baseBitType: BitType.article,\n    description: 'Book reference, used to reference a book in another book',\n    tags: [\n      {\n        key: ConfigKey.property_refAuthor,\n        description: 'The author of the referenced book',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_refBookTitle,\n        description: 'The title of the referenced book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_refPublisher,\n        description: 'The publisher of the referenced book',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_refPublicationYear,\n        description: 'The publication year of the referenced book',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_citationStyle,\n        description: 'The citation style to use for the book reference',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.botActionResponse]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Bot action response bit, used to define responses for bot actions',\n\n    cardSet: CardSetConfigKey.botActionResponses,\n  },\n  [BitType.botActionSend]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Bot action send bit, used to define actions for sending messages',\n    tags: [\n      {\n        key: ConfigKey.property_date,\n        description: 'The date when the message should be sent',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.browserImage]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Browser image bit, used to display images in the browser',\n    tags: [\n      {\n        key: ConfigKey.property_focusX,\n        description: 'The X coordinate for focusing the image in the browser',\n        format: TagFormat.number,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_focusY,\n        description: 'The Y coordinate for focusing the image in the browser',\n        format: TagFormat.number,\n        nullable: true,\n      },\n    ],\n  },\n  [BitType.card1]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Card bit, used for cards in quizzes',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common tags for quiz bits',\n      },\n    ],\n  },\n  [BitType.question1]: {\n    since: '1.3.0',\n    baseBitType: BitType.card1,\n    description: 'Question card bit',\n  },\n  [BitType.survey1]: { since: '1.3.0', baseBitType: BitType.card1, description: 'Survey card bit' },\n  [BitType.surveyAnonymous1]: {\n    since: '1.3.0',\n    baseBitType: BitType.card1,\n    description: 'Anonymous survey card bit',\n  },\n  [BitType.chapter]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Chapter bit, used to define chapters in books or articles',\n    // PLAN-140 W3 (NISO import, tranche 1): recover a chapter from a NISO\n    // section or annex. STRUCTURAL key (no @children content slot): the\n    // element carries no body of its own — tag children (label/title) map\n    // via tag keys, every mapped descendant promotes to a following sibling\n    // bit, and the chapter level derives from nesting depth (catalog D1).\n    // The source id lands as [@customerId] (two-id model, D2).\n    mappingKeys: {\n      'xml-niso-iec': { '@el': 'sec|app', '@attr': { id: '$customerId' }, '▼': '$anchor' },\n    },\n    tags: [\n      {\n        exportJsonKey: { anchor: '$' },\n        key: ConfigKey.tag_anchor,\n        format: TagFormat.plainText,\n        description: 'The anchor for the chapter, used for linking',\n      },\n      {\n        key: ConfigKey.tag_title,\n        description: 'The title of the chapter',\n        jsonKey: 'title|setMulti(level)',\n        exportJsonKey: { title: '$', level: '$level' },\n        // PLAN-140 W3 (NISO import): the section/annex title; the heading\n        // level rides the normalizer-derived nesting depth (plan Q2).\n        mappingKeys: { 'xml-niso-iec': { '@el': 'title', '@text': '$' } },\n      },\n      {\n        key: ConfigKey.property_toc,\n        description: 'If the chapter should be included in the table of contents',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n      {\n        key: ConfigKey.property_progress,\n        description: 'The progress of the chapter, used for tracking reading progress',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.clozeAndMultipleChoiceText]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Cloze and multiple choice text bit, used for quizzes with cloze and multiple choice questions',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common tags for quiz bits',\n      },\n      {\n        key: ConfigKey.group_gap,\n        description: 'Tags for gaps in cloze and multiple choice text bits',\n      },\n      {\n        key: ConfigKey.group_trueFalseInlineSelect,\n        description: 'Tags for true/false questions in cloze and multiple choice text bits',\n      },\n      {\n        // Bit-level @isCaseSensitive — empty exportJsonKey (no bit-level emission);\n        // defaultValue 'true' phantom-fires onto the ancestor stack so the gap chain's\n        // `@absent: $ancestor` rule resolves to true. Mirrors BPG Builder.ts:1643-1652\n        // `pushDownTree(... 'isCaseSensitive', data.isCaseSensitive ?? true)` for cloze bits.\n        key: ConfigKey.property_isCaseSensitive,\n        exportJsonKey: {},\n        description: 'If the cloze answers are case sensitive',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n      {\n        // Override inherited @example: in `isTopLevelExample` allow-list.\n        key: ConfigKey.property_example,\n        exportJsonKey: [\n          { '@keyonly': { isExample: true } },\n          { '@absent': { isExample: true } },\n          { isExample: true, example: '$' },\n        ],\n        description: 'The example(s) for the bit',\n        format: TagFormat.bitmarkText,\n        nullable: true,\n      },\n    ],\n  },\n  [BitType.coachCallToActionClozeAndMultipleChoiceText]: {\n    since: '1.3.0',\n    baseBitType: BitType.clozeAndMultipleChoiceText,\n    description: 'Coach call to action cloze and multiple choice text bit',\n  },\n  [BitType.cloze]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Cloze bit, used for fill-in-the-blank questions in quizzes',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common tags for quiz bits',\n      },\n      {\n        key: ConfigKey.property_isCaseSensitive,\n        exportJsonKey: {},\n        description: 'If the cloze answers are case sensitive',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n      {\n        key: ConfigKey.property_quizCountItems,\n        description: 'The number of items in the cloze quiz',\n        format: TagFormat.boolean,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_quizStrikethroughSolutions,\n        description: 'If the cloze solutions should be strikethrough',\n        format: TagFormat.boolean,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.group_gap,\n        description: 'Tags for gaps in cloze bits',\n      },\n      {\n        // Override inherited @example: cloze is in OLD parser's\n        // `isTopLevelExample` allow-list, so [@example] at bit-header\n        // emits `isExample: true`.\n        key: ConfigKey.property_example,\n        exportJsonKey: [\n          { '@keyonly': { isExample: true } },\n          { '@absent': { isExample: true } },\n          { isExample: true, example: '$' },\n        ],\n        description: 'The example(s) for the bit',\n        format: TagFormat.bitmarkText,\n        nullable: true,\n      },\n    ],\n  },\n  [BitType.clozeInstructionGrouped]: {\n    since: '1.3.0',\n    baseBitType: BitType.cloze,\n    description:\n      'Cloze instruction grouped bit, used for cloze questions with grouped instructions',\n    tags: [\n      {\n        key: ConfigKey.property_quizCountItems,\n        description: 'The number of items in the cloze quiz (instruction-grouped default: true)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n      // Note: quizStrikethroughSolutions defaults to false for instruction-grouped per OLD\n      // JsonGenerator.ts:1689-1690, which equals the Boolean natural default → no override needed.\n    ],\n  },\n  [BitType.clozeSolutionGrouped]: {\n    since: '1.3.0',\n    baseBitType: BitType.cloze,\n    description: 'Cloze solution grouped bit, used for cloze questions with grouped solutions',\n    tags: [\n      {\n        key: ConfigKey.property_quizCountItems,\n        description: 'The number of items in the cloze quiz (solution-grouped default: true)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n      {\n        key: ConfigKey.property_quizStrikethroughSolutions,\n        description:\n          'If the cloze solutions should be strikethrough (solution-grouped default: true)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.clozeSeveral]: {\n    since: '3.5.0',\n    baseBitType: BitType.cloze,\n    description: 'Cloze several bit, used for cloze questions with multiple answers',\n  },\n  [BitType.gapText]: {\n    since: '1.5.15',\n    baseBitType: BitType.cloze,\n    description: 'Gap text bit, used for fill-in-the-blank questions in quizzes with text gaps',\n  },\n  [BitType.gapTextInstructionGrouped]: {\n    since: '1.5.15',\n    baseBitType: BitType.clozeInstructionGrouped,\n    description:\n      'Gap text instruction grouped bit, used for fill-in-the-blank questions with grouped instructions',\n  },\n  [BitType.coachSelfReflectionCloze]: {\n    since: '1.3.0',\n    baseBitType: BitType.cloze,\n    description: 'Coach self-reflection cloze bit, used for self-reflection questions in coaching',\n  },\n  [BitType.coachCallToActionCloze]: {\n    since: '1.3.0',\n    baseBitType: BitType.cloze,\n    description: 'Coach call to action cloze bit, used for call to action questions in coaching',\n  },\n  [BitType.clozeList]: {\n    since: '1.4.13',\n    baseBitType: BitType._standard,\n    description: 'Cloze list bit, used for lists of cloze questions in quizzes',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common tags for quiz bits',\n      },\n      {\n        // PLAN-084 (R12): bit-level @isCaseSensitive — empty exportJsonKey\n        // (no bit-level emission); defaultValue 'true' phantom-fires onto\n        // the ancestor stack so each listItem's gap chain `@absent: $ancestor`\n        // rule resolves to true. Mirrors the cloze bit (bits.ts:1326-1336).\n        key: ConfigKey.property_isCaseSensitive,\n        exportJsonKey: {},\n        description: 'If the cloze answers are case sensitive',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n    cardSet: CardSetConfigKey.clozeList,\n  },\n  [BitType.code]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Code bit, used for code snippets in articles or documents',\n    // PLAN-141 F4 (NISO import): a <code> block is a CONTENT bit with a\n    // literal text body; @language recovers as [@computerLanguage] (absent\n    // attr → no tag). Anchor = the source id (D2 revised).\n    mappingKeys: {\n      'xml-niso-iec': {\n        '@el': 'code',\n        '@attr': { id: '$customerId', language: '$computerLanguage' },\n        '▼': '$anchor',\n        '@text': '$',\n      },\n    },\n    tags: [\n      {\n        key: ConfigKey.property_computerLanguage,\n        description: 'The programming language of the code snippet',\n        format: TagFormat.plainText,\n        // PLAN-141 F4 (NISO import): the bit key's `language` sigil recovers\n        // a present attr; this `@absent` rule supplies the AUTHORED default\n        // when the source carries none (catalog code row — an untyped block\n        // is `[@computerLanguage:text]`). Fires only on foreign imports,\n        // never the carrier round-trip.\n        mappingKeys: { 'xml-niso-iec': [{ '@absent': 'text' }] },\n      },\n      {\n        key: ConfigKey.property_codeLineNumbers,\n        description: 'If line numbers should be displayed for the code snippet',\n        format: TagFormat.boolean,\n      },\n      {\n        key: ConfigKey.property_codeMinimap,\n        description: 'If a minimap should be displayed for the code snippet',\n        format: TagFormat.boolean,\n      },\n    ],\n    textFormatDefault: TextFormat.plainText,\n  },\n  [BitType.formula]: {\n    since: '1.35.0',\n    baseBitType: BitType._standard,\n    description: 'Formula bit, used for mathematical formulas in articles or documents',\n\n    textFormatDefault: TextFormat.latex,\n  },\n  [BitType.formulaImage]: {\n    since: '5.23.0',\n    baseBitType: BitType.formula,\n    description: 'Formula image bit, used for mathematical formulas rendered as images',\n  },\n  [BitType.smartStandardFormula]: {\n    since: '3.11.0',\n    baseBitType: BitType.formula,\n    description: 'Smart standard formula bit, used for mathematical formulas in smart standards',\n  },\n  [BitType.smartStandardFormulaNonNormative]: {\n    since: '3.11.0',\n    baseBitType: BitType.formula,\n    description:\n      'Smart standard non-normative formula bit, used for mathematical formulas in smart standards that are non-normative',\n  },\n  [BitType.smartStandardFormulaNormative]: {\n    since: '3.11.0',\n    baseBitType: BitType.formula,\n    description:\n      'Smart standard normative formula bit, used for mathematical formulas in smart standards that are normative',\n    // PLAN-141 F4 (NISO import): a <disp-formula> is a CONTENT bit whose\n    // latex-format body carries the <mml:math> subtree VERBATIM (G1 — no\n    // MathML↔LaTeX transform; ids stripped); <label> → [%]; a contained\n    // <legend> PROMOTES as a sibling legend bit (cards cannot nest in a\n    // body). Anchor = the source id (D2 revised).\n    mappingKeys: {\n      'xml-niso-iec': {\n        '@el': 'disp-formula',\n        '@attr': { id: '$customerId' },\n        '▼': '$anchor',\n        '@children': '$',\n      },\n    },\n  },\n  [BitType.smartStandardRemarkFormula]: {\n    since: '3.11.0',\n    baseBitType: BitType.formula,\n    description:\n      'Smart standard remark formula bit, used for mathematical formulas in smart standards remarks',\n  },\n  [BitType.smartStandardRemarkFormulaNonNormative]: {\n    since: '3.11.0',\n    baseBitType: BitType.formula,\n    description:\n      'Smart standard non-normative remark formula bit, used for mathematical formulas in smart standards remarks that are non-normative',\n  },\n  [BitType.smartStandardRemarkFormulaNormative]: {\n    since: '3.11.0',\n    baseBitType: BitType.formula,\n    description:\n      'Smart standard normative remark formula bit, used for mathematical formulas in smart standards remarks that are normative',\n  },\n  [BitType.appCodeCell]: {\n    since: '1.4.3',\n    baseBitType: BitType.code,\n    description: 'App code cell, used to create code cells in the app editor',\n  },\n  [BitType.appCodeEditor]: {\n    since: '1.4.3',\n    baseBitType: BitType.code,\n    description: 'App code editor, used to create code editors in the app editor',\n  },\n  [BitType.appCodeIde]: {\n    since: '1.4.3',\n    baseBitType: BitType.code,\n    description: 'App code IDE, used to create code IDEs in the app editor',\n  },\n  [BitType.codeRuntime]: {\n    since: '1.4.3',\n    baseBitType: BitType.code,\n    description: 'Code runtime, used to define the runtime environment for code snippets',\n  },\n  [BitType.consoleLog]: {\n    since: '1.4.3',\n    baseBitType: BitType.code,\n    description: 'Console log, used to log messages to the console in code snippets',\n  },\n  [BitType.output]: {\n    since: '1.4.3',\n    baseBitType: BitType.code,\n    description: 'Output bit, used to display output from code snippets',\n  },\n  [BitType.stdout]: {\n    since: '1.4.3',\n    baseBitType: BitType.code,\n    description: 'Standard output bit, used to display standard output from code snippets',\n  },\n  [BitType.sandbox]: {\n    since: '4.10.0',\n    baseBitType: BitType.code,\n    description: 'A sandbox bit, used to create a sandboxed environment for code execution',\n  },\n  [BitType.sandboxOutputJson]: {\n    since: '4.10.0',\n    baseBitType: BitType.code,\n    description: 'A sandbox output JSON bit, used to display JSON output from sandboxed code',\n  },\n  [BitType.sandboxOutputMarkup]: {\n    since: '4.10.0',\n    baseBitType: BitType.code,\n    description: 'A sandbox output markup bit, used to display markup output from sandboxed code',\n  },\n  [BitType.sandboxOutputRender]: {\n    since: '4.10.0',\n    baseBitType: BitType.code,\n    description: 'A sandbox output render bit, used to display rendered output from sandboxed code',\n  },\n  [BitType.step]: {\n    since: '1.5.1',\n    baseBitType: BitType.article,\n    description: 'Step bit, used to define steps in a process or guide',\n  },\n  [BitType.stepImageScreenshot]: {\n    since: '1.5.1',\n    baseBitType: BitType.image,\n    description: 'Step image screenshot bit, used to display screenshots in steps',\n  },\n  [BitType.stepImageScreenshotWithPointer]: {\n    since: '1.5.1',\n    baseBitType: BitType.image,\n    description:\n      'Step image screenshot with pointer bit, used to display screenshots with pointers in steps',\n    tags: [\n      {\n        key: ConfigKey.property_pointerTop,\n        description: 'The top position of the pointer in the screenshot',\n        format: TagFormat.plainText,\n        minCount: 1,\n        maxCount: 1,\n      },\n      {\n        key: ConfigKey.property_pointerLeft,\n        description: 'The left position of the pointer in the screenshot',\n        format: TagFormat.plainText,\n        minCount: 1,\n        maxCount: 1,\n      },\n    ],\n  },\n  [BitType.milestone]: {\n    since: '1.20.0',\n    baseBitType: BitType.step,\n    description: 'Milestone bit, used to define milestones in a process or guide',\n  },\n  [BitType.conversationLeft1]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Conversation left bit, used to create a conversation on the left side of the screen',\n    tags: [\n      {\n        key: ConfigKey.group_person,\n        exportJsonKey: { partner: { name: '$' } },\n        description: 'Tags for the person in the conversation',\n      },\n    ],\n  },\n  [BitType.conversationLeft1Scream]: {\n    since: '1.3.0',\n    baseBitType: BitType.conversationLeft1,\n    description:\n      'Conversation left scream bit, used to create a conversation with a scream on the left side of the screen',\n  },\n  [BitType.conversationLeft1Thought]: {\n    since: '1.3.0',\n    baseBitType: BitType.conversationLeft1,\n    description:\n      'Conversation left thought bit, used to create a conversation with a thought on the left side of the screen',\n  },\n  [BitType.conversationRight1]: {\n    since: '1.3.0',\n    baseBitType: BitType.conversationLeft1,\n    description:\n      'Conversation right bit, used to create a conversation on the right side of the screen',\n  },\n  [BitType.conversationRight1Scream]: {\n    since: '1.3.0',\n    baseBitType: BitType.conversationLeft1,\n    description:\n      'Conversation right scream bit, used to create a conversation with a scream on the right side of the screen',\n  },\n  [BitType.conversationRight1Thought]: {\n    since: '1.3.0',\n    baseBitType: BitType.conversationLeft1,\n    description:\n      'Conversation right thought bit, used to create a conversation with a thought on the right side of the screen',\n  },\n  [BitType.clozeAndMultipleChoiceTextConversationLeft1]: {\n    since: '1.3.0',\n    baseBitType: BitType.conversationLeft1,\n    description:\n      'Cloze and multiple choice text conversation left bit, used for conversations with cloze and multiple choice text on the left side of the screen',\n  },\n  [BitType.clozeAndMultipleChoiceTextConversationLeft1Scream]: {\n    since: '1.3.0',\n    baseBitType: BitType.conversationLeft1,\n    description:\n      'Cloze and multiple choice text conversation left scream bit, used for conversations with cloze and multiple choice text and a scream on the left side of the screen',\n  },\n  [BitType.clozeAndMultipleChoiceTextConversationLeft1Thought]: {\n    since: '1.3.0',\n    baseBitType: BitType.conversationLeft1,\n    description:\n      'Cloze and multiple choice text conversation left thought bit, used for conversations with cloze and multiple choice text and a thought on the left side of the screen',\n  },\n  [BitType.clozeAndMultipleChoiceTextConversationRight1]: {\n    since: '1.3.0',\n    baseBitType: BitType.conversationLeft1,\n    description:\n      'Cloze and multiple choice text conversation right bit, used for conversations with cloze and multiple choice text on the right side of the screen',\n  },\n  [BitType.clozeAndMultipleChoiceTextConversationRight1Scream]: {\n    since: '1.3.0',\n    baseBitType: BitType.conversationLeft1,\n    description:\n      'Cloze and multiple choice text conversation right scream bit, used for conversations with cloze and multiple choice text and a scream on the right side of the screen',\n  },\n  [BitType.clozeAndMultipleChoiceTextConversationRight1Thought]: {\n    since: '1.3.0',\n    baseBitType: BitType.conversationLeft1,\n    description:\n      'Cloze and multiple choice text conversation right thought bit, used for conversations with cloze and multiple choice text and a thought on the right side of the screen',\n  },\n\n  [BitType.advertising]: {\n    since: '4.2.0',\n    baseBitType: BitType.article,\n    description: 'General advertising content bit',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n  [BitType.advertisingAdvertorial]: {\n    since: '4.2.0',\n    baseBitType: BitType.article,\n    description: 'Advertorial content bit (sponsored article)',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n\n  [BitType.advertisingCallToAction]: {\n    since: '4.2.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call-to-action for advertising',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n  [BitType.advertisingCallToActionMeeting]: {\n    since: '4.2.0',\n    baseBitType: BitType.callToAction,\n    description: 'Call-to-action for meeting or appointment',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n\n  [BitType.advertisingBanner]: {\n    since: '4.2.0',\n    baseBitType: BitType.image,\n    description: 'Banner advertisement bit',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n  [BitType.advertisingSkyscraper]: {\n    since: '4.2.0',\n    baseBitType: BitType.image,\n    description: 'Skyscraper (vertical) advertisement bit',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n  [BitType.advertisingRectangle]: {\n    since: '4.2.0',\n    baseBitType: BitType.image,\n    description: 'Rectangle advertisement bit',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n\n  [BitType.advertisingFullPage]: {\n    since: '4.2.0',\n    baseBitType: BitType.image,\n    description: 'Full-page advertisement bit',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n  [BitType.advertisingHalfPage]: {\n    since: '4.2.0',\n    baseBitType: BitType.image,\n    description: 'Half-page advertisement bit',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n  [BitType.advertisingQuarterPage]: {\n    since: '4.2.0',\n    baseBitType: BitType.image,\n    description: 'Quarter-page advertisement bit',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n  [BitType.advertisingClassifiedPage]: {\n    since: '4.2.0',\n    baseBitType: BitType.image,\n    description: 'Classifieds advertisement page bit',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n  [BitType.advertisingLandscape]: {\n    since: '4.2.0',\n    baseBitType: BitType.image,\n    description: 'Landscape format advertisement bit',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n  [BitType.advertisingPortrait]: {\n    since: '4.2.0',\n    baseBitType: BitType.image,\n    description: 'Portrait format advertisement bit',\n    tags: [\n      {\n        key: ConfigKey.group_advertisingCommon,\n        description: 'Common advertising tags',\n      },\n    ],\n  },\n\n  [BitType.cookPreparation]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Cook preparation bit',\n  },\n  [BitType.cookStep]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Cook step bit',\n  },\n  [BitType.cookIngredients]: {\n    since: '1.5.16',\n    baseBitType: BitType._standard,\n    description: 'Cook ingredients bit, used to define ingredients for recipes',\n    tags: [\n      {\n        key: ConfigKey.group_technicalTerm,\n        description: 'Tags for technical terms related to ingredients',\n      },\n      {\n        key: ConfigKey.property_servings,\n        jsonKey: 'servings.servings',\n        exportJsonKey: { servings: { servings: '$' } },\n        description: 'The number of servings for the ingredients',\n        format: TagFormat.number,\n        chain: [\n          {\n            key: ConfigKey.property_unit,\n            description: 'The unit of measurement for the ingredients (singular)',\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.property_unitPlural,\n            description: 'The unit of measurement for the ingredients (plural)',\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.property_unitAbbr,\n            description: 'The abbreviation for the unit of measurement (singular)',\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.property_unitAbbrPlural,\n            description: 'The abbreviation for the unit of measurement (plural)',\n            format: TagFormat.plainText,\n          },\n          {\n            key: ConfigKey.property_decimalPlaces,\n            description: 'The number of decimal places for the ingredient quantity',\n            format: TagFormat.number,\n            defaultValue: '1',\n          },\n          {\n            key: ConfigKey.property_disableCalculation,\n            description: 'If the ingredient quantity calculation should be disabled',\n            format: TagFormat.boolean,\n          },\n          {\n            exportJsonKey: { hint: '$' },\n            key: ConfigKey.tag_hint,\n            description: 'Hint for the ingredient, used to provide additional information',\n            format: TagFormat.plainText,\n          },\n        ],\n      },\n    ],\n    cardSet: CardSetConfigKey.ingredients,\n  },\n  [BitType.recipe]: {\n    since: '1.5.24',\n    baseBitType: BitType.cookIngredients,\n    description: 'Recipe bit, used to define a recipe',\n  },\n  [BitType.cookRemark]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Cook remark bit, used to add remarks to recipes',\n  },\n  [BitType.cookVariation]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Cook variation bit, used to define variations of recipes',\n  },\n  [BitType.cookInsert]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Cook insert bit, used to insert additional content in recipes',\n  },\n  [BitType.cookNoteOnQuantity]: {\n    since: '3.27.0',\n    baseBitType: BitType.article,\n    description: 'Cook note on quantity bit, used to add notes on ingredient quantities in recipes',\n  },\n  [BitType.cookArrangement]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Cook arrangement bit, used to arrange ingredients or steps in recipes',\n  },\n  [BitType.cookPracticeAdvise]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Cook practice advice bit, used to provide practical advice in recipes',\n  },\n  [BitType.cookPlate]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Cook plate bit, used to define the presentation of a dish',\n  },\n  [BitType.cookRecommendation]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Cook recommendation bit, used to recommend dishes or ingredients',\n  },\n  [BitType.cookPersonalRecommendation]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Cook personal recommendation bit, used to provide personal recommendations for dishes or ingredients',\n  },\n  [BitType.cookSideDrink]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Cook side drink bit, used to define side drinks for dishes',\n  },\n  [BitType.cookSideDish]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Cook side dish bit, used to define side dishes for main courses',\n  },\n  [BitType.cookTimer]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Cook timer bit, used to set timers for cooking steps',\n  },\n  [BitType.document]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Document bit, used to define documents in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Tags for resource bits, used to categorize documents',\n      },\n      {\n        key: ConfigKey.group_resourceDocument,\n        description: 'Tags for document resources, used to define documents in articles or books',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.documentDownload]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Document download bit, used to define downloadable documents in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Tags for resource bits, used to categorize downloadable documents',\n      },\n      {\n        key: ConfigKey.group_resourceDocumentDownload,\n        description:\n          'Tags for downloadable document resources, used to define downloadable documents in articles or books',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.leDocumentDownload]: {\n    since: '3.18.0',\n    baseBitType: BitType.documentDownload,\n    description:\n      'LE Document download bit, used to define downloadable documents in learning experiences',\n  },\n  [BitType.documentEmbed]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Document embed bit, used to embed documents in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Tags for resource bits, used to categorize embedded documents',\n      },\n      {\n        key: ConfigKey.group_resourceDocumentEmbed,\n        description:\n          'Tags for embedded document resources, used to define embedded documents in articles or books',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.documentLink]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Document link bit, used to link to documents in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Tags for resource bits, used to categorize document links',\n      },\n      {\n        key: ConfigKey.group_resourceDocumentLink,\n        description:\n          'Tags for document link resources, used to define links to documents in articles or books',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.essay]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Essay bit, used to define essays in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common tags for quiz bits',\n      },\n      {\n        key: ConfigKey.property_reasonableNumOfChars,\n        description: 'The reasonable number of characters for the essay',\n        format: TagFormat.number,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_sampleSolution,\n        description: 'Sample solution for the essay, used as a reference answer',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_partialAnswer,\n        description: 'Partial answer for the essay, used to indicate incomplete answers',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_reference,\n        description: 'Reference for the essay, used to link to external resources',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        // Override inherited @example from group_standardTags: emits both\n        // `isExample` (bool) AND `example` (paragraph array). Declared as\n        // bitmarkText because BPG `JsonGenerator.toExample` renders the\n        // root-example value through the bit's textFormat (not this tag's\n        // declared format) — `TagFormat.plainText` here would be ignored\n        // at runtime and is misleading.\n        key: ConfigKey.property_example,\n        exportJsonKey: [\n          { '@keyonly': { isExample: true, example: 'true' } },\n          { '@absent': { isExample: true, example: 'true' } },\n          { isExample: true, example: '$' },\n        ],\n        description: 'The example text for the essay bit',\n        format: TagFormat.bitmarkText,\n        nullable: true,\n      },\n    ],\n    rootExampleType: ExampleType.string,\n  },\n  [BitType.coachSelfReflectionEssay]: {\n    since: '1.3.0',\n    baseBitType: BitType.essay,\n    description: 'Coach self-reflection essay bit',\n  },\n  [BitType.coachCallToActionEssay]: {\n    since: '1.3.0',\n    baseBitType: BitType.essay,\n    description: 'Coach call to action essay bit',\n  },\n  [BitType.example]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Example bit, used to provide examples in articles or books',\n    tags: [\n      {\n        maxCount: 2,\n        jsonKey: 'title|multi(count=2, key=subtitle)',\n        exportJsonKey: [{ '@level=1': { title: '$' } }, { '@level=2': { subtitle: '$' } }],\n        key: ConfigKey.tag_title,\n        description: 'The title of the example',\n      },\n      {\n        // Override inherited @example from group_standardTags: string root example.\n        key: ConfigKey.property_example,\n        exportJsonKey: [\n          { '@keyonly': { isExample: true, example: 'true' } },\n          { '@absent': { isExample: true, example: 'true' } },\n          { isExample: true, example: '$' },\n        ],\n        description: 'The example text for the example bit',\n        format: TagFormat.plainText,\n        nullable: true,\n      },\n    ],\n    rootExampleType: ExampleType.string,\n  },\n  [BitType.exampleAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.example,\n    description:\n      'Alternative example bit, used to provide alternative examples in articles or books',\n  },\n  [BitType.standardExampleNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.example,\n    description:\n      'Standard normative example bit, used to provide normative examples in articles or books',\n  },\n  [BitType.standardExampleNonNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.example,\n    description:\n      'Standard non-normative example bit, used to provide non-normative examples in articles or books',\n  },\n  [BitType.smartStandardExampleNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardExampleNormative,\n    description:\n      'Smart standard normative example bit, used to provide normative examples in smart standards',\n  },\n  [BitType.smartStandardExampleNonNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardExampleNonNormative,\n    description:\n      'Smart standard non-normative example bit, used to provide non-normative examples in smart standards',\n  },\n  [BitType.smartStandardExampleNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardExampleNormative,\n    description:\n      'Smart standard normative example collapsible bit, used to provide normative examples in smart standards that can be collapsed',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.smartStandardExampleNonNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardExampleNonNormative,\n    description:\n      'Smart standard non-normative example collapsible bit, used to provide non-normative examples in smart standards that can be collapsed',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.authorContentBitGenerator]: {\n    since: '4.2.0',\n    baseBitType: BitType.article,\n    description: 'Body contains the content of one or more bits to be created by the bit generator',\n    tags: [\n      {\n        key: ConfigKey.property_classification,\n        description: 'Classification for the created bits',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n    ],\n  },\n  [BitType.appAiPrompt]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'App AI prompt bit, used to create AI prompts in the app editor',\n  },\n  [BitType.aiPrompt]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'AI prompt bit, used to create AI prompts in articles or books',\n  },\n  [BitType.aiChat]: {\n    since: '4.2.0',\n    baseBitType: BitType.article,\n    description: 'AI chat bit, used to create an AI chat',\n  },\n  [BitType.aiEditor]: {\n    since: '4.2.0',\n    baseBitType: BitType.article,\n    description: 'AI editor bit, used to create an AI editor',\n  },\n  [BitType.aiTutor]: {\n    since: '4.2.0',\n    baseBitType: BitType.article,\n    description: 'AI tutor bit, used to create an AI tutor',\n  },\n  [BitType.aiWbt]: {\n    since: '4.2.0',\n    baseBitType: BitType.article,\n    description: 'AI WBT bit, used to create an AI WBT (Web-Based Training)',\n  },\n  [BitType.articleAi]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Article AI bit, used to create AI-generated articles',\n    tags: [\n      {\n        // Shadows the inherited @aiGenerated from the standard group: this\n        // bit type forces aiGenerated:true regardless of source value or\n        // absence. Literal `true` in the export pattern ignores `$`.\n        key: ConfigKey.property_aiGenerated,\n        description: 'AI-generated flag, forced true for article-ai bits',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n        exportJsonKey: { aiGenerated: true },\n      },\n    ],\n  },\n  [BitType.articleAttachment]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Article attachment bit, used to attach files to articles',\n  },\n  [BitType.assignment]: {\n    since: '1.3.0',\n    baseBitType: BitType.essay,\n    description: 'Assignment bit, used to define assignments in articles or books',\n  },\n  [BitType.audioTranscript]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Audio transcript bit, used to provide transcripts for audio files in articles or books',\n  },\n  [BitType.bitmarkExample]: {\n    since: '1.3.0',\n    baseBitType: BitType.example,\n    description: 'Bitmark example bit, used to provide examples for bitmarks in articles or books',\n  },\n  [BitType.blogArticle]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Blog article bit, used to define blog articles in articles or books',\n  },\n  [BitType.bug]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Bug bit, used to report bugs in articles or books',\n  },\n  [BitType.bugAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.bug,\n    description:\n      'Alternative bug bit, used to report bugs in articles or books with alternative styling',\n  },\n  [BitType.checklist]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Checklist bit, used to create checklists in articles or books',\n  },\n  [BitType.coachAudioTranscript]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Coach audio transcript bit, used to provide transcripts for audio files in coaching articles or books',\n  },\n  [BitType.coachCallToActionChecklist]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Coach call to action checklist bit, used to create checklists in coaching articles or books',\n  },\n  [BitType.coachHomeRules]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Coach home rules bit, used to define home rules in coaching articles or books',\n  },\n  [BitType.coachVideoTranscript]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Coach video transcript bit, used to provide transcripts for video files in coaching articles or books',\n  },\n  [BitType.correction]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Correction bit, used to provide corrections in articles or books',\n  },\n  [BitType.danger]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Danger bit, used to highlight dangerous or critical information in articles or books',\n  },\n  [BitType.dangerAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.article,\n    description:\n      'Alternative danger bit, used to highlight dangerous or critical information in articles or books with alternative styling',\n  },\n  [BitType.definitionTerm]: {\n    since: '1.34.0',\n    baseBitType: BitType.article,\n    description: 'Definition term bit, used to define terms in articles or books',\n  },\n  [BitType.deleted]: {\n    since: '3.9.0',\n    baseBitType: BitType.article,\n    description: 'Deleted bit, used to indicate deleted content in articles or books',\n  },\n  [BitType.details1]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Details bit, used to provide additional details in articles or books',\n  },\n  [BitType.details]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Details bit, used to provide additional details in articles or books',\n  },\n  [BitType.qAndA]: {\n    since: '3.5.0',\n    baseBitType: BitType.article,\n    description: 'Q&A bit, used to create question and answer sections in articles or books',\n  },\n  [BitType.editorial]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Editorial bit, used to provide editorial content in articles or books',\n  },\n  [BitType.editorNote]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Editor note bit, used to provide notes from the editor in articles or books',\n  },\n  [BitType.featured]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Featured bit, used to highlight featured content in articles or books',\n  },\n  [BitType.glossaryTerm]: {\n    since: '1.33.0',\n    baseBitType: BitType.article,\n    description: 'Glossary term bit, used to define glossary terms in articles or books',\n  },\n  [BitType.help]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Help bit, used to provide help or support information in articles or books',\n  },\n  [BitType.helpAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.help,\n    description:\n      'Alternative help bit, used to provide help or support information in articles or books with alternative styling',\n  },\n  [BitType.hint]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Hint bit, used to provide hints or tips in articles or books',\n  },\n  [BitType.hintAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.hint,\n    description:\n      'Alternative hint bit, used to provide hints or tips in articles or books with alternative styling',\n  },\n  [BitType.indexTerm]: {\n    since: '1.33.0',\n    baseBitType: BitType.article,\n    description: 'Index term bit, used to define index terms in articles or books',\n  },\n  [BitType.info]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Info bit, used to provide informational content in articles or books',\n  },\n  [BitType.infoAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.info,\n    description:\n      'Alternative info bit, used to provide informational content in articles or books with alternative styling',\n  },\n  [BitType.langLearningOutcomes]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language learning outcomes bit, used to define learning outcomes in language articles or books',\n  },\n  [BitType.langEnablingLanguageSkills]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language enabling skills bit, used to define enabling language skills in language articles or books',\n  },\n  [BitType.langLifeSkills]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language life skills bit, used to define life skills in language articles or books',\n  },\n  [BitType.langEnglishAroundWorld]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language English around the world bit, used to provide information about English usage around the world in language articles or books',\n  },\n  [BitType.langGoodToKnow]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language good to know bit, used to provide useful information in language articles or books',\n  },\n  [BitType.langLearningGoal]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language learning goal bit, used to define learning goals in language articles or books',\n  },\n  [BitType.langLearningStrategy]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language learning strategy bit, used to define learning strategies in language articles or books',\n  },\n  [BitType.langLikeALocal]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language like a local bit, used to provide tips for speaking like a local in language articles or books',\n  },\n  [BitType.langMaterial]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language material bit, used to provide language learning materials in language articles or books',\n  },\n  [BitType.langUsefulPhrases]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language useful phrases bit, used to provide useful phrases in language articles or books',\n  },\n  [BitType.langLevelDown]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language level down bit, used to provide information about lower language levels in language articles or books',\n  },\n  [BitType.langLevelUp]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language level up bit, used to provide information about higher language levels in language articles or books',\n  },\n  [BitType.langExtraActivity]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language extra activity bit, used to provide additional activities in language articles or books',\n  },\n  [BitType.langVideoScript]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language video script bit, used to provide scripts for language learning videos in articles or books',\n  },\n  [BitType.langAudioScript]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language audio script bit, used to provide scripts for language learning audio files in articles or books',\n  },\n  [BitType.langVocabulary]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language vocabulary bit, used to provide vocabulary lists in language articles or books',\n  },\n  [BitType.langHomework]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language homework bit, used to define homework assignments in language articles or books',\n  },\n  [BitType.langTeacherNote]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language teacher note bit, used to provide notes for teachers in language articles or books',\n  },\n  [BitType.langTeacherPronunciation]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Language teacher pronunciation bit, used to provide pronunciation guidance for teachers in language articles or books',\n  },\n  [BitType.list]: {\n    since: '1.22.0',\n    baseBitType: BitType.article,\n    description: 'List bit, used to create lists in articles or books',\n  },\n  [BitType.standardList]: {\n    since: '1.22.0',\n    baseBitType: BitType.article,\n    description: 'Standard list bit, used to create standard lists in articles or books',\n  },\n  [BitType.smartStandardList]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardList,\n    description:\n      'Smart standard list bit, used to create smart standard lists in articles or books',\n    // PLAN-140 refs family (NISO import): a reference list is a STRUCTURAL\n    // bit (no @children — it takes a path ordinal anchor and its <ref>\n    // children promote to sibling list-item bits); its <title> rides [#]\n    // via the title tag key.\n    mappingKeys: {\n      'xml-niso-iec': { '@el': 'ref-list', '@attr': { id: '$customerId' }, '▼': '$anchor' },\n    },\n  },\n  [BitType.smartStandardListCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardList,\n    description:\n      'Smart standard list collapsible bit, used to create collapsible smart standard lists in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.message]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Message bit, used to create messages in articles or books',\n  },\n  [BitType.newspaperArticle]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Newspaper article bit, used to define newspaper articles in articles or books',\n  },\n  [BitType.note]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Note bit, used to provide notes in articles or books',\n  },\n  [BitType.noteAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.note,\n    description:\n      'Alternative note bit, used to provide notes in articles or books with alternative styling',\n  },\n  [BitType.standardNoteNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.note,\n    description:\n      'Standard normative note bit, used to provide normative notes in articles or books',\n  },\n  [BitType.standardNoteNonNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.note,\n    description:\n      'Standard non-normative note bit, used to provide non-normative notes in articles or books',\n  },\n  [BitType.smartStandardNoteNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardNoteNormative,\n    description:\n      'Smart standard normative note bit, used to provide normative notes in smart standards',\n  },\n  [BitType.smartStandardNoteNonNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardNoteNonNormative,\n    description:\n      'Smart standard non-normative note bit, used to provide non-normative notes in smart standards',\n    // PLAN-140 W3 (NISO import, tranche 1). CONTENT key (@children): a\n    // note's inner paragraphs are note body, never separate bits.\n    mappingKeys: {\n      'xml-niso-iec': {\n        '@el': 'non-normative-note',\n        '@attr': { id: '$customerId' },\n        '@children': '$',\n        '▼': '$anchor',\n      },\n    },\n  },\n  [BitType.smartStandardNoteNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardNoteNormative,\n    description:\n      'Smart standard normative note collapsible bit, used to provide normative notes in smart standards that can be collapsed',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.smartStandardNoteNonNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardNoteNonNormative,\n    description:\n      'Smart standard non-normative note collapsible bit, used to provide non-normative notes in smart standards that can be collapsed',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.noteAi]: {\n    since: '1.3.0',\n    baseBitType: BitType.note,\n    description: 'Note AI bit, used to create AI-generated notes in articles or books',\n    tags: [\n      {\n        // Shadows the inherited @aiGenerated from the standard group: this\n        // bit type forces aiGenerated:true regardless of source value or\n        // absence. Literal `true` in the export pattern ignores `$`.\n        key: ConfigKey.property_aiGenerated,\n        description: 'AI-generated flag, forced true for article-ai bits',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n        exportJsonKey: { aiGenerated: true },\n      },\n    ],\n  },\n  [BitType.notebookArticle]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Notebook article bit, used to define notebook articles in articles or books',\n  },\n  [BitType.preparationNote]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Preparation note bit, used to provide preparation notes in articles or books',\n  },\n  [BitType.printThisBook]: {\n    since: '5.4.0',\n    baseBitType: BitType._standard,\n    description: 'Print this book bit, used to create a button that prints the entire book',\n    tags: [\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'The caption of the print button',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.printThisChapter]: {\n    since: '5.4.0',\n    baseBitType: BitType._standard,\n    description: 'Print this chapter bit, used to create a button that prints the current chapter',\n    tags: [\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'The caption of the print button',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_printParentChapterLevel,\n        description: 'The parent chapter level to print',\n        format: TagFormat.number,\n        defaultValue: '-1',\n      },\n    ],\n  },\n  [BitType.printPageBreak]: {\n    since: '5.4.0',\n    baseBitType: BitType.separator,\n    description:\n      'Print page break bit, used to create page breaks for printing in articles or books',\n  },\n  [BitType.releaseNotesSummary]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Release notes summary bit, used to summarize release notes in articles or books',\n  },\n  [BitType.remark]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Remark bit, used to provide remarks in articles or books',\n  },\n  [BitType.remarkAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.remark,\n    description:\n      'Alternative remark bit, used to provide remarks in articles or books with alternative styling',\n  },\n  [BitType.standardRemarkNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.article,\n    description:\n      'Standard normative remark bit, used to provide normative remarks in articles or books',\n  },\n  [BitType.standardRemarkNonNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.article,\n    description:\n      'Standard non-normative remark bit, used to provide non-normative remarks in articles or books',\n  },\n  [BitType.smartStandardRemarkNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardRemarkNormative,\n    description:\n      'Smart standard normative remark bit, used to provide normative remarks in smart standards',\n  },\n  [BitType.smartStandardRemarkNonNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardRemarkNonNormative,\n    description:\n      'Smart standard non-normative remark bit, used to provide non-normative remarks in smart standards',\n    // PLAN-140 Q4 rider: a warning/caution note routes to the remark bit —\n    // the same element as the note key, distinguished by the content-type\n    // attr literal (alias value: forward emits the first alternative,\n    // reverse accepts any). Most-specific-wins beats the plain note key.\n    mappingKeys: {\n      'xml-niso-iec': {\n        '@el': 'non-normative-note',\n        '@attr': { 'content-type': 'warning|caution', id: '$customerId' },\n        '@children': '$',\n        '▼': '$anchor',\n      },\n    },\n  },\n  [BitType.smartStandardRemarkNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardRemarkNormative,\n    description:\n      'Smart standard normative remark collapsible bit, used to provide normative remarks in smart standards that can be collapsed',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.smartStandardRemarkNonNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardRemarkNonNormative,\n    description:\n      'Smart standard non-normative remark collapsible bit, used to provide non-normative remarks in smart standards that can be collapsed',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.selfAssessment]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Self-assessment bit, used to create self-assessment sections in articles or books',\n  },\n  [BitType.separator]: {\n    since: '1.4.15',\n    baseBitType: BitType.article,\n    description: 'Separator bit, used to create visual separators in articles or books',\n  },\n  [BitType.separatorAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.separator,\n    description:\n      'Alternative separator bit, used to create visual separators in articles or books with alternative styling',\n  },\n  [BitType.sticker]: {\n    since: '1.5.28',\n    baseBitType: BitType.article,\n    description: 'Sticker bit, used to create stickers in articles or books',\n  },\n  [BitType.sideNote]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Side note bit, used to provide side notes in articles or books',\n  },\n  [BitType.summary]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Summary bit, used to provide summaries in articles or books',\n  },\n  [BitType.summaryAi]: {\n    since: '1.3.0',\n    baseBitType: BitType.summary,\n    description: 'AI-generated summary bit',\n    tags: [\n      {\n        // Shadows the inherited @aiGenerated from the standard group: this\n        // bit type forces aiGenerated:true regardless of source value or\n        // absence. Literal `true` in the export pattern ignores `$`.\n        key: ConfigKey.property_aiGenerated,\n        description: 'AI-generated flag, forced true for article-ai bits',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n        exportJsonKey: { aiGenerated: true },\n      },\n    ],\n  },\n  [BitType.videoTranscript]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description:\n      'Video transcript bit, used to provide transcripts for video files in articles or books',\n  },\n  [BitType.warning]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Warning bit, used to highlight warnings in articles or books',\n  },\n  [BitType.warningAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.warning,\n    description:\n      'Alternative warning bit, used to highlight warnings in articles or books with alternative styling',\n  },\n  [BitType.workbookArticle]: {\n    since: '1.3.0',\n    baseBitType: BitType.article,\n    description: 'Workbook article bit, used to define workbook articles in articles or books',\n  },\n  [BitType.collapsible]: {\n    since: '1.21.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.article,\n    description: 'Collapsible bit, used to create collapsible sections in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.sideNoteCollapsible]: {\n    since: '1.21.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.sideNote,\n    description:\n      'Side note collapsible bit, used to create collapsible side notes in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.infoCollapsible]: {\n    since: '1.21.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.info,\n    description:\n      'Info collapsible bit, used to create collapsible informational sections in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.remarkCollapsible]: {\n    since: '1.21.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.remark,\n    description: 'Remark collapsible bit, used to create collapsible remarks in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.warningCollapsible]: {\n    since: '1.21.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.warning,\n    description:\n      'Warning collapsible bit, used to create collapsible warnings in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.dangerCollapsible]: {\n    since: '1.21.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.danger,\n    description:\n      'Danger collapsible bit, used to create collapsible danger sections in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.noteCollapsible]: {\n    since: '1.21.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.note,\n    description: 'Note collapsible bit, used to create collapsible notes in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.exampleCollapsible]: {\n    since: '1.21.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.example,\n    description:\n      'Example collapsible bit, used to create collapsible examples in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.hintCollapsible]: {\n    since: '1.21.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.hint,\n    description: 'Hint collapsible bit, used to create collapsible hints in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.bugCollapsible]: {\n    since: '1.21.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.bug,\n    description: 'Bug collapsible bit, used to create collapsible bug reports in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.platformPath]: {\n    since: '3.14.1',\n    baseBitType: BitType._standard,\n    description: 'Platform path bit, used to define paths in the platform',\n    tags: [\n      {\n        key: ConfigKey.property_path,\n        description: 'The path for the platform, used to define navigation paths',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.appCalculatorLatex]: {\n    since: '4.10.0',\n    baseBitType: BitType.article,\n    description:\n      'A LaTeX calculator bit, used to create a calculator that can interpret LaTeX expressions',\n    tags: [\n      {\n        key: ConfigKey.property_formula,\n        description: 'The LaTeX formula for the calculator, used to define the calculation logic',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.container]: {\n    since: '1.9.0',\n    baseBitType: BitType.article,\n    description: 'Container bit, used to group bits together in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_allowedBit,\n        description:\n          'Allowed bits in the container, used to define which bits can be placed inside',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n    ],\n  },\n  [BitType.containerWrap]: {\n    since: '1.9.0',\n    baseBitType: BitType.container,\n    description: 'Container wrap bit, used to wrap content in a container',\n  },\n  [BitType.containerNowrap]: {\n    since: '1.9.0',\n    baseBitType: BitType.container,\n    description: 'Container nowrap bit, used to prevent wrapping of content in a container',\n  },\n  [BitType.containerNowrapStretch]: {\n    since: '1.9.0',\n    baseBitType: BitType.container,\n    description:\n      'Container nowrap stretch bit, used to stretch content without wrapping in a container',\n  },\n  [BitType.containerGroup]: {\n    since: '1.9.0',\n    baseBitType: BitType.container,\n    description: 'Container group bit, used to group multiple containers together',\n  },\n  [BitType.containerFolder]: {\n    since: '1.9.0',\n    baseBitType: BitType.container,\n    description: 'Container folder bit, used to create folders for organizing bits',\n  },\n  [BitType.containerCarousel]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description: 'Container carousel bit, used to create carousels for displaying bits',\n  },\n  [BitType.containerCards]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description: 'Container cards bit, used to create card layouts for displaying bits',\n  },\n  [BitType.containerGrid]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description: 'Container grid bit, used to create grid layouts for displaying bits',\n  },\n  [BitType.containerStack]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description: 'Container stack bit, used to create stacked layouts for displaying bits',\n  },\n  [BitType.containerSlides]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description: 'Container slides bit, used to create slide presentations for displaying bits',\n  },\n  [BitType.containerGallery]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description: 'Container gallery bit, used to create galleries for displaying bits',\n  },\n  [BitType.containerScroller]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description: 'Container scroller bit, used to create scrolling sections for displaying bits',\n  },\n  [BitType.containerTabs]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description: 'Container tabs bit, used to create tabbed sections for displaying bits',\n  },\n  [BitType.containerAccordionTabs]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description:\n      'Container accordion tabs bit, used to create accordion-style tabbed sections for displaying bits',\n  },\n  [BitType.containerFolderAll]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description:\n      'Container folder all bit, used to create folders that can contain all types of bits',\n  },\n  [BitType.containerBits2]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description:\n      'Container bits 2 bit, used to create a container for bits with additional features',\n  },\n  [BitType.containerCookRecipe]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description:\n      'Container cook recipe bit, used to create recipe containers for displaying cooking recipes',\n  },\n  [BitType.containerNewsArticle]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description: 'Container news article bit, used to create containers for news articles',\n  },\n  [BitType.containerPreview]: {\n    since: '1.11.0',\n    baseBitType: BitType.container,\n    description: 'Container preview bit, used to create preview sections for displaying bits',\n  },\n  [BitType.pageContainer]: {\n    since: '1.9.0',\n    baseBitType: BitType.container,\n    description: 'Page container bit, used to create containers for pages in articles or books',\n  },\n  [BitType.pageContainerWrap]: {\n    since: '1.9.0',\n    baseBitType: BitType.pageContainer,\n    description: 'Page container wrap bit, used to wrap content in a page container',\n  },\n  [BitType.pageContainerNowrap]: {\n    since: '1.9.0',\n    baseBitType: BitType.pageContainer,\n    description:\n      'Page container nowrap bit, used to prevent wrapping of content in a page container',\n  },\n  [BitType.pageContainerNowrapStretch]: {\n    since: '1.9.0',\n    baseBitType: BitType.pageContainer,\n    description:\n      'Page container nowrap stretch bit, used to stretch content without wrapping in a page container',\n  },\n  [BitType.pageContainerFolder]: {\n    since: '1.9.0',\n    baseBitType: BitType.pageContainer,\n    description:\n      'Page container folder bit, used to create folders for organizing bits in a page container',\n  },\n  [BitType.pageContainerGroup]: {\n    since: '1.9.0',\n    baseBitType: BitType.pageContainer,\n    description: 'Page container group bit, used to group multiple page containers together',\n  },\n  [BitType.metalevelExplanation]: {\n    since: '1.10.0',\n    baseBitType: BitType.article,\n    description:\n      'Metalevel explanation bit, used to provide explanations for metalevels in articles or books',\n  },\n  [BitType.module]: {\n    since: '1.5.26',\n    baseBitType: BitType.article,\n    description: 'Module bit, used to define modules in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_hasBookNavigation,\n        description: 'Indicates if the module has book navigation',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n      {\n        key: ConfigKey.property_productId,\n        description: 'Product ID for the module, used to link to a specific product',\n        format: TagFormat.plainText,\n        minCount: 1,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_duration,\n        description: 'Duration of the module, used to indicate how long it takes to complete',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.moduleProduct]: {\n    since: '1.9.0',\n    baseBitType: BitType.module,\n    description: 'Module product bit, used to define products in modules',\n    tags: [\n      {\n        key: ConfigKey.property_productId,\n        description: 'Product ID for the module product, used to link to a specific product',\n        format: TagFormat.plainText,\n        minCount: 1,\n        maxCount: 1,\n      },\n    ],\n  },\n  [BitType.exampleList]: {\n    since: '1.4.13',\n    baseBitType: BitType.example,\n    description: 'Example list bit, used to create lists of examples in articles or books',\n    cardSet: CardSetConfigKey.exampleBitList,\n    rootExampleType: ExampleType.string,\n  },\n  [BitType.extractorPage]: {\n    since: '1.5.17',\n    baseBitType: BitType.image,\n    description: 'Extractor page bit, used to extract pages from images',\n  },\n  [BitType.extractorPageCollapsible]: {\n    since: '1.30.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.extractorPage,\n    description:\n      'Collapsible extractor page bit, used to extract pages from images with collapsible functionality',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.extractorPageWithBlocks]: {\n    since: '1.5.21',\n    baseBitType: BitType.image,\n    description: 'Extractor page with blocks bit, used to extract pages with blocks from images',\n  },\n  [BitType.extractorPageWithBlocksCollapsible]: {\n    since: '1.30.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.extractorPageWithBlocks,\n    description:\n      'Collapsible extractor page with blocks bit, used to extract pages with blocks from images with collapsible functionality',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.extractorConfiguration]: {\n    since: '1.7.1',\n    baseBitType: BitType._standard,\n    description: 'Extractor configuration bit, used to configure extractors in articles or books',\n\n    textFormatDefault: TextFormat.plainText,\n  },\n  [BitType.extractorBlueprintConfiguration]: {\n    since: '5.11.0',\n    baseBitType: BitType._standard,\n    description:\n      'Extractor blueprint configuration bit, used to specify extractor blueprint configuration when extracting from blueprints',\n\n    textFormatDefault: TextFormat.plainText,\n  },\n  [BitType.extractorImage]: {\n    since: '4.3.0',\n    baseBitType: BitType._standard,\n    description: 'Extractor images bit, used for images extracted from PDFs',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description:\n          'Resource bit tags for logo grave images, used to define additional properties',\n      },\n      {\n        // Image resource — fully-expanded shape so each `&image` emission\n        // produces a complete `{type, image: {src}}` object inside the\n        // `images[]` array. Chain attrs like `[@zoomDisabled]` fold under\n        // `images[].image` via the `[]` last-element-merge semantic.\n        key: ConfigKey.group_resourceImageNoZoom,\n        description: 'Resource image tags for logo grave images, used to attach images',\n        exportJsonKey: { images: [{ type: 'image', image: { src: '$' } }] },\n        minCount: 1,\n        maxCount: Count.infinity,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n    textFormatDefault: TextFormat.plainText,\n  },\n  [BitType.extractorImageCollapsible]: {\n    since: '4.3.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.extractorImage,\n    description: 'Collapsible extractor images bit, used for  images extracted from PDFs',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.extractorBlueprint]: {\n    since: '5.12.0',\n    baseBitType: BitType._standard,\n    description: 'Extractor blueprint bit, used to provide blueprint information about extractors',\n    textFormatDefault: TextFormat.json,\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Resource bit tags for the blueprint reference image',\n      },\n      {\n        key: ConfigKey.group_resourceImage,\n        description:\n          'Optional uncropped reference page image, used so authoring tools can compute crops against the original page dimensions',\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.extractorInformation]: {\n    since: '3.8.0',\n    baseBitType: BitType._standard,\n    description:\n      'Extractor information bit, used to provide information about extractors in articles or books',\n\n    textFormatDefault: TextFormat.json,\n  },\n  [BitType.extractorTheme]: {\n    since: '5.7.0',\n    baseBitType: BitType._standard,\n    description: 'Extractor theme bit, used to store design/theme JSON extracted from documents',\n\n    textFormatDefault: TextFormat.json,\n  },\n  [BitType.extractorReconcile]: {\n    since: '5.35.0',\n    baseBitType: BitType._standard,\n    description:\n      'Extractor reconcile bit, used to store PDF-compare reconciliation decisions (config and issues) in JSON',\n    textFormatDefault: TextFormat.json,\n  },\n  [BitType.extractorAiChat]: {\n    since: '3.19.0',\n    baseBitType: BitType._standard,\n    description:\n      'Extractor AI chat bit, used to create AI chat interfaces for extractors in articles or books',\n  },\n  [BitType.extractorBlock]: {\n    since: '1.5.16',\n    baseBitType: BitType._standard,\n    description: 'Extractor block bit, used to define blocks within extractor pages',\n    tags: [\n      {\n        key: ConfigKey.property_blockId,\n        description:\n          'Unique identifier for the block, used to reference the block in extractor pages',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_pageNo,\n        description:\n          'Page number for the block, used to indicate the page on which the block appears',\n        format: TagFormat.number,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_x,\n        description: 'X-coordinate for the block, used to position the block on the page',\n        format: TagFormat.number,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_y,\n        description: 'Y-coordinate for the block, used to position the block on the page',\n        format: TagFormat.number,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_width,\n        description: 'Width of the block, used to define the size of the block on the page',\n        format: TagFormat.number,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_height,\n        description: 'Height of the block, used to define the size of the block on the page',\n        format: TagFormat.number,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_index,\n        description: 'Index of the block, used to order blocks within the extractor page',\n        format: TagFormat.number,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_classification,\n        description:\n          'Classification for the block, used to categorize the block within the extractor',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_availableClassifications,\n        description:\n          'Available classifications for the block, used to define possible classifications',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.group_resourceImage,\n        description: 'Resource image for the block, used to attach images to the block',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.extractorRepeatedText]: {\n    since: '1.5.21',\n    baseBitType: BitType.article,\n    description: 'Extractor repeated text bit, used to define repeated text in extractor pages',\n  },\n  [BitType.extractorRule]: {\n    since: '5.17.0',\n    baseBitType: BitType._standard,\n    description:\n      'Extractor rule bit, used to define extraction rules with reference images and instructions',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Resource bit tags for extraction rule images',\n      },\n      {\n        key: ConfigKey.group_resourceImage,\n        description: 'Resource image tags for the rule reference image',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n    textFormatDefault: TextFormat.plainText,\n  },\n  [BitType.extractorPageNumber]: {\n    since: '1.5.21',\n    baseBitType: BitType.article,\n    description: 'Extractor page number bit, used to define page numbers in extractor pages',\n  },\n  [BitType.extractorPageNumberCollapsible]: {\n    since: '1.30.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.extractorPageNumber,\n    description:\n      'Collapsible extractor page number bit, used to define page numbers in extractor pages with collapsible functionality',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.extractorPageHeader]: {\n    since: '1.5.21',\n    baseBitType: BitType.article,\n    description: 'Extractor page header bit, used to define headers in extractor pages',\n  },\n  [BitType.extractorPageHeaderCollapsible]: {\n    since: '1.30.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.extractorPageHeader,\n    description:\n      'Collapsible extractor page header bit, used to define headers in extractor pages with collapsible functionality',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.extractorPageFooter]: {\n    since: '1.5.21',\n    baseBitType: BitType.article,\n    description: 'Extractor page footer bit, used to define footers in extractor pages',\n  },\n  [BitType.extractorPageFooterCollapsible]: {\n    since: '1.30.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.extractorPageFooter,\n    description:\n      'Collapsible extractor page footer bit, used to define footers in extractor pages with collapsible functionality',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.pageOpenBook]: {\n    since: '1.5.10',\n    baseBitType: BitType.article,\n    description: 'Page open book bit, used to create pages that open books in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description: 'Slug for the book, used to identify the book in the system',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_book,\n        description: 'Book reference for the page, used to link to a specific book',\n        format: TagFormat.plainText,\n        chain: [\n          {\n            exportJsonKey: { reference: '$' },\n            key: ConfigKey.tag_reference,\n            format: TagFormat.plainText,\n            description: 'Reference tag for the book, used to link to the book in the system',\n            maxCount: 1,\n            chain: [\n              {\n                key: ConfigKey.tag_reference,\n                jsonKey: 'referenceEnd',\n                exportJsonKey: { referenceEnd: '$' },\n                format: TagFormat.plainText,\n                description: 'End reference tag for the book, used to specify a range',\n                maxCount: 1,\n              },\n            ],\n          },\n        ],\n      },\n      {\n        /* Allow incorrectly chained reference tag */\n        exportJsonKey: { reference: '$' },\n        key: ConfigKey.tag_reference,\n        format: TagFormat.plainText,\n        description: 'Reference tag for the book, used to link to the book in the system',\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'Caption for the button, used to define the text displayed on the button',\n      },\n      {\n        key: ConfigKey.property_authorFullName,\n        description: 'Full name of the author',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_authorPseudonym,\n        description: 'A pseudonym of the author, if any',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_authorTitle,\n        description: 'The title of the author, e.g. \"Dr.\", \"Prof.\", etc.',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_authorJobTitle,\n        description: 'The job title of the author, e.g. \"Software Engineer\", \"Professor\", etc.',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.printBook]: {\n    since: '5.5.0',\n    baseBitType: BitType.article,\n    description:\n      'Print book bit, used to create pages that open books without author information in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description: 'Slug for the book, used to identify the book in the system',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_book,\n        description: 'Book reference for the page, used to link to a specific book',\n        format: TagFormat.plainText,\n        chain: [\n          {\n            exportJsonKey: { reference: '$' },\n            key: ConfigKey.tag_reference,\n            format: TagFormat.plainText,\n            description: 'Reference tag for the book, used to link to the book in the system',\n            maxCount: 1,\n            chain: [\n              {\n                key: ConfigKey.tag_reference,\n                jsonKey: 'referenceEnd',\n                exportJsonKey: { referenceEnd: '$' },\n                format: TagFormat.plainText,\n                description: 'End reference tag for the book, used to specify a range',\n                maxCount: 1,\n              },\n            ],\n          },\n        ],\n      },\n      {\n        /* Allow incorrectly chained reference tag */\n        exportJsonKey: { reference: '$' },\n        key: ConfigKey.tag_reference,\n        format: TagFormat.plainText,\n        description: 'Reference tag for the book, used to link to the book in the system',\n        maxCount: 1,\n        chain: [\n          {\n            key: ConfigKey.tag_reference,\n            jsonKey: 'referenceEnd',\n            exportJsonKey: { referenceEnd: '$' },\n            format: TagFormat.plainText,\n            description: 'End reference tag for the book, used to specify a range',\n            maxCount: 1,\n          },\n        ],\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'Caption for the button, used to define the text displayed on the button',\n      },\n    ],\n  },\n  [BitType.openBookChapter]: {\n    since: '4.16.0',\n    baseBitType: BitType.pageOpenBook,\n    description:\n      'Open book chapter bit, derived from page-open-book, used to create chapter pages that open books',\n  },\n  [BitType.openBookChapterTeaser]: {\n    since: '4.16.0',\n    baseBitType: BitType.openBookChapter,\n    description:\n      'Open book chapter teaser bit, equal to open-book-chapter, used to create teaser chapter pages that open books',\n  },\n  [BitType.pageOpenBookList]: {\n    since: '2.1.0',\n    baseBitType: BitType.article,\n    description:\n      'Page open book list bit, used to create pages that open lists of books in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_book,\n        // Starter-array shape: each `[@book:value]` chain appends a fresh\n        // `{ book, reference }` entry. The chained `►` (tag_reference) lands\n        // inside the most-recently-appended entry as `reference: $`.\n        exportJsonKey: { book: [{ book: '$' }] },\n        description: 'Book reference for the page, used to link to a specific book',\n        maxCount: Count.infinity,\n        chain: [\n          {\n            exportJsonKey: { reference: '$' },\n            key: ConfigKey.tag_reference,\n            format: TagFormat.plainText,\n            description: 'Reference tag for the book, used to link to the book in the system',\n            maxCount: 1,\n            chain: [\n              {\n                key: ConfigKey.tag_reference,\n                jsonKey: 'referenceEnd',\n                exportJsonKey: { referenceEnd: '$' },\n                format: TagFormat.plainText,\n                description: 'End reference tag for the book, used to specify a range',\n                maxCount: 1,\n              },\n            ],\n          },\n        ],\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'Caption for the button, used to define the text displayed on the button',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.pageSubscribe]: {\n    since: '1.5.10',\n    baseBitType: BitType.article,\n    description:\n      'Page subscribe bit, used to create pages that allow users to subscribe to content',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description: 'Slug for the subscription page, used to identify the page in the system',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description:\n          'Caption for the subscription button, used to define the text displayed on the button',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_mailingList,\n        description: 'Mailing list for the subscription, used to link to a specific mailing list',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.assignmentList]: {\n    since: '1.4.13',\n    baseBitType: BitType.exampleList,\n    description: 'Assignment list bit, used to create lists of assignments in articles or books',\n  },\n  [BitType.pageFooter]: {\n    since: '1.4.13',\n    baseBitType: BitType.article,\n    description: 'Page footer bit, used to create footers in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description: 'Slug for the footer, used to identify the footer in the system',\n        format: TagFormat.plainText,\n      },\n    ],\n    // page-footer emits cards under `sections` (vs `listItems` for the\n    // sibling exampleList / assignmentList bits) — see JsonGenerator.ts.\n    cardSet: CardSetConfigKey.pageFooterSections,\n  },\n  [BitType.legend]: {\n    since: '3.12.0',\n    baseBitType: BitType._standard,\n    description: 'Legend bit, used to provide legends in articles or books',\n\n    cardSet: CardSetConfigKey.definitionList,\n  },\n  [BitType.smartStandardLegend]: {\n    since: '3.12.0',\n    baseBitType: BitType.legend,\n    description:\n      'Smart standard legend bit, used to provide smart standard legends in articles or books',\n  },\n  [BitType.smartStandardLegendNonNormative]: {\n    since: '3.12.0',\n    baseBitType: BitType.legend,\n    description:\n      'Smart standard non-normative legend bit, used to provide non-normative smart standard legends in articles or books',\n  },\n  [BitType.smartStandardLegendNormative]: {\n    since: '3.12.0',\n    baseBitType: BitType.legend,\n    description:\n      'Smart standard normative legend bit, used to provide normative smart standard legends in articles or books',\n    // PLAN-141 F2 (NISO import): a free-standing <legend> (a formula's) or\n    // bare <def-list> (a table footer's — no <legend> wrapper there) that is\n    // NOT the claimed card content of its enclosing bit is a legend bit:\n    // STRUCTURAL-shaped, its <title> and <def-item>s build the\n    // definition-list cards via the card set's authored keys. A <legend>\n    // inside a figure/table bit stays that bit's claimed card content and\n    // never reaches this key. Anchor = the source id (D2 revised).\n    mappingKeys: {\n      'xml-niso-iec': [\n        { '@el': 'legend', '@attr': { id: '$customerId' }, '▼': '$anchor' },\n        { '@el': 'def-list', '@attr': { id: '$customerId' }, '▼': '$anchor' },\n      ],\n    },\n  },\n  [BitType.smartStandardRemarkLegend]: {\n    since: '3.12.0',\n    baseBitType: BitType.legend,\n    description:\n      'Smart standard remark legend bit, used to provide smart standard remarks in legends',\n  },\n  [BitType.smartStandardRemarkLegendNonNormative]: {\n    since: '3.12.0',\n    baseBitType: BitType.legend,\n    description:\n      'Smart standard non-normative remark legend bit, used to provide non-normative smart standard remarks in legends',\n  },\n  [BitType.smartStandardRemarkLegendNormative]: {\n    since: '3.12.0',\n    baseBitType: BitType.legend,\n    description:\n      'Smart standard normative remark legend bit, used to provide normative smart standard remarks in legends',\n  },\n  [BitType.definitionList]: {\n    since: '1.34.0',\n    baseBitType: BitType._standard,\n    description: 'Definition list bit, used to create lists of definitions in articles or books',\n    tags: [\n      {\n        // Override inherited @example: in `isTopLevelExample` allow-list.\n        key: ConfigKey.property_example,\n        exportJsonKey: [\n          { '@keyonly': { isExample: true } },\n          { '@absent': { isExample: true } },\n          { isExample: true, example: '$' },\n        ],\n        description: 'The example(s) for the bit',\n        format: TagFormat.bitmarkText,\n        nullable: true,\n      },\n    ],\n    cardSet: CardSetConfigKey.definitionList,\n  },\n  [BitType.definitionListCollapsible]: {\n    since: '5.25.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.definitionList,\n    description:\n      'Collapsible definition list bit, used to create collapsible lists of definitions in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.standardDefinitionListNormative]: {\n    since: '5.24.0',\n    baseBitType: BitType.definitionList,\n    description:\n      'Standard normative definition list bit, used to create normative standard definition lists in articles or books',\n  },\n  [BitType.standardDefinitionListNonNormative]: {\n    since: '5.24.0',\n    baseBitType: BitType.definitionList,\n    description:\n      'Standard non-normative definition list bit, used to create non-normative standard definition lists in articles or books',\n  },\n  [BitType.smartStandardDefinitionListNormative]: {\n    since: '5.24.0',\n    baseBitType: BitType.standardDefinitionListNormative,\n    description:\n      'Smart standard normative definition list bit, used to create normative smart standard definition lists in articles or books',\n    // PLAN-141 F3 (NISO import): a terms-and-definitions clause. STRUCTURAL-\n    // shaped: <label> → [%], the tbx:termEntry/langSet subtree builds the\n    // definition-list card via the card set's authored keys (all tig terms\n    // stacked on the term side; definition/example/notes/source composed on\n    // the definition side with authored locale affixes), langSet @xml:lang →\n    // [@lang] (nested attr slot on the tag key). Anchor = the source id.\n    mappingKeys: {\n      'xml-niso-iec': { '@el': 'term-sec', '@attr': { id: '$customerId' }, '▼': '$anchor' },\n    },\n  },\n  [BitType.smartStandardDefinitionListNonNormative]: {\n    since: '5.24.0',\n    baseBitType: BitType.standardDefinitionListNonNormative,\n    description:\n      'Smart standard non-normative definition list bit, used to create non-normative smart standard definition lists in articles or books',\n  },\n  [BitType.metaSearchDefaultTerms]: {\n    since: '3.12.0',\n    baseBitType: BitType._standard,\n    description: 'Meta search default terms bit, used to define default search terms in articles',\n\n    cardSet: CardSetConfigKey.definitionListPlain,\n  },\n  [BitType.metaSearchDefaultTopics]: {\n    since: '3.12.0',\n    baseBitType: BitType.metaSearchDefaultTerms,\n    description: 'Meta search default topics bit, used to define default search topics in articles',\n  },\n  [BitType.flashcard]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Flashcard bit, used to create flashcards in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for flashcards',\n      },\n      {\n        // Override inherited @example: in `isTopLevelExample` allow-list.\n        key: ConfigKey.property_example,\n        exportJsonKey: [\n          { '@keyonly': { isExample: true } },\n          { '@absent': { isExample: true } },\n          { isExample: true, example: '$' },\n        ],\n        description: 'The example(s) for the bit',\n        format: TagFormat.bitmarkText,\n        nullable: true,\n      },\n    ],\n    cardSet: CardSetConfigKey.flashcard,\n  },\n  [BitType.flashcard1]: {\n    since: '1.3.0',\n    baseBitType: BitType.flashcard,\n    description: 'Flashcard 1 bit',\n    // PLAN-085: use the flashcard1 cardset (sections.default.maxCount=1)\n    // instead of inheriting `flashcard`'s unbounded cardset, since this\n    // bit type structurally allows only a single card.\n    cardSet: CardSetConfigKey.flashcard1,\n  },\n  [BitType.qAndACard]: {\n    since: '3.25.0',\n    baseBitType: BitType.flashcard1,\n    description: 'Q&A card bit, used to create question and answer cards in articles or books',\n    // PLAN-085: q-and-a-card permits multiple cards (some fixtures carry\n    // two). Override the inherited `flashcard1` (max=1) cardset back to\n    // the unbounded `flashcard` cardset.\n    cardSet: CardSetConfigKey.flashcard,\n  },\n  [BitType.focusImage]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Focus image bit, used to create images with focus points in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_focusX,\n        description: 'X-coordinate for the focus point, used to define the focus area in the image',\n        format: TagFormat.number,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_focusY,\n        description: 'Y-coordinate for the focus point, used to define the focus area in the image',\n        format: TagFormat.number,\n        nullable: true,\n      },\n    ],\n  },\n  [BitType.highlightText]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Highlight text bit, used to create highlighted text in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for highlighted text',\n      },\n      {\n        // Dedicated highlight inline-select chain: tag_true / tag_false\n        // emit `{type:\"highlight\", attrs:{texts:[{text,isCorrect?}]}}`\n        // inline body nodes via @body-inline. Bit shares no tag IDs with\n        // multiple-choice / multiple-choice-1 (which use group_trueFalse).\n        key: ConfigKey.group_trueFalseInlineHighlight,\n        description: 'True/False quiz tags for highlighted text (inline body nodes)',\n      },\n      {\n        // Override inherited @example: in `isTopLevelExample` allow-list.\n        key: ConfigKey.property_example,\n        exportJsonKey: [\n          { '@keyonly': { isExample: true } },\n          { '@absent': { isExample: true } },\n          { isExample: true, example: '$' },\n        ],\n        description: 'The example(s) for the bit',\n        format: TagFormat.bitmarkText,\n        nullable: true,\n      },\n    ],\n  },\n  [BitType.image]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Image bit, used to create images in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_backgroundWallpaper,\n        description:\n          'Background wallpaper tags for images, used to define background properties for images',\n      },\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description:\n          'Resource bit tags for images, used to define additional properties for images',\n      },\n      {\n        key: ConfigKey.group_resourceImage,\n        description: 'Resource image tags for images, used to attach images to the bit',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.appCreateBitsFromImage]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'App create bits from image bit, used to create bits from images in the app',\n  },\n  [BitType.appGetScreenshot]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'App get screenshot bit, used to capture screenshots in the app',\n  },\n  [BitType.detailsImage]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Details image bit, used to create detailed images in articles or books',\n  },\n  [BitType.figure]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Figure bit, used to create figures in articles or books',\n    cardSet: CardSetConfigKey.definitionList,\n  },\n  [BitType.imageBanner]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Image banner bit, used to create banners in articles or books',\n  },\n  [BitType.imageFigure]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Image figure bit, used to create figures with images in articles or books',\n    cardSet: CardSetConfigKey.definitionList,\n  },\n  [BitType.imageFigureAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.imageFigure,\n    description:\n      'Alternative image figure bit, used to create figures with alternative images in articles or books',\n  },\n  [BitType.standardImageFigureNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.imageFigure,\n    description:\n      'Standard normative image figure bit, used to create normative image figures in articles or books',\n  },\n  [BitType.standardImageFigureNonNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.imageFigure,\n    description:\n      'Standard non-normative image figure bit, used to create non-normative image figures in articles or books',\n  },\n  [BitType.smartStandardImageFigureNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardImageFigureNormative,\n    description:\n      'Smart standard normative image figure bit, used to create smart standard normative image figures in articles or books',\n    // PLAN-141 F1 (NISO import): a figure is STRUCTURAL-shaped (no\n    // @children — no body): <label> → [%], <caption>/<graphic> ride the\n    // [&image] resource chain, the <legend> def-list becomes the bit's\n    // definition-list cards, and an inner note PROMOTES as a sibling bit.\n    // Anchor = the source id (D2 revised).\n    mappingKeys: {\n      'xml-niso-iec': { '@el': 'fig', '@attr': { id: '$customerId' }, '▼': '$anchor' },\n    },\n  },\n  [BitType.smartStandardImageFigureNonNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardImageFigureNonNormative,\n    description:\n      'Smart standard non-normative image figure bit, used to create smart standard non-normative image figures in articles or books',\n  },\n  [BitType.smartStandardImageFigureNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardImageFigureNormative,\n    description:\n      'Collapsible smart standard normative image figure bit, used to create collapsible smart standard normative image figures in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.smartStandardImageFigureNonNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardImageFigureNonNormative,\n    description:\n      'Collapsible smart standard non-normative image figure bit, used to create collapsible smart standard non-normative image figures in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.imageLandscape]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Image landscape bit, used to create landscape images in articles or books',\n  },\n  [BitType.imageMood]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Image mood bit, used to create mood images in articles or books',\n  },\n  [BitType.imagePortrait]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Image portrait bit, used to create portrait images in articles or books',\n  },\n  [BitType.imagePrototype]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Image prototype bit, used to create prototype images in articles or books',\n  },\n  [BitType.imageSeparator]: {\n    since: '1.4.15',\n    baseBitType: BitType._standard,\n    description: 'Image separator bit, used to create separators in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_imageNoZoom,\n        description:\n          'Image no zoom tags for images, used to define whether images should have zoom functionality',\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.imageSeparatorAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.imageSeparator,\n    description:\n      'Alternative image separator bit, used to create alternative separators in articles or books',\n  },\n  [BitType.imageScreenshot]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Image screenshot bit, used to create screenshots in articles or books',\n  },\n  [BitType.imageStyled]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Image styled bit, used to create styled images in articles or books',\n  },\n  [BitType.imageSuperWide]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Image super wide bit, used to create super wide images in articles or books',\n  },\n  [BitType.imageZoom]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Image zoom bit, used to create zoomable images in articles or books',\n  },\n  [BitType.langLifeSkillIcon]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description:\n      'Language life skill icon bit, used to create icons for life skills in articles or books',\n  },\n  [BitType.lifeSkillSticker]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description:\n      'Life skill sticker bit, used to create stickers for life skills in articles or books',\n  },\n  [BitType.pageBanner]: {\n    since: '1.4.3',\n    baseBitType: BitType._standard,\n    description: 'Page banner bit, used to create banners for pages in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description: 'Slug for the page banner, used to identify the banner in the system',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.group_imageNoZoom,\n        description:\n          'Image no zoom tags for images, used to define whether images should have zoom functionality',\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.pageHero]: {\n    since: '1.11.0',\n    baseBitType: BitType.pageBanner,\n    description: 'Page hero bit, used to create hero sections in articles or books',\n  },\n  [BitType.screenshot]: {\n    since: '1.3.0',\n    deprecated: '1.4.0',\n    baseBitType: BitType.image,\n    description: 'Screenshot bit, used to create screenshots in articles or books',\n  },\n  [BitType.tableImage]: {\n    since: '1.5.15',\n    baseBitType: BitType.tableExtended,\n    description: 'Table image bit, used to create images in tables in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_caption,\n        description: 'Caption for the table image, used to provide a description for the image',\n        format: TagFormat.bitmarkText,\n        // HTML-10 / HTML-C2: render as the table's `<caption>` (see table bit).\n        htmlKey: { '@el': 'caption', '@children': '$' },\n      },\n      {\n        key: ConfigKey.group_backgroundWallpaper,\n        description:\n          'Background wallpaper tags for images, used to define background properties for images',\n      },\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description:\n          'Resource bit tags for images, used to define additional properties for images',\n      },\n      {\n        key: ConfigKey.group_resourceImage,\n        description: 'Resource image tags for images, used to attach images to the bit',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.tableImageAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.tableImage,\n    description:\n      'Alternative table image bit, used to create alternative images in tables in articles or books',\n  },\n  [BitType.standardTableImageNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.tableImage,\n    description:\n      'Standard normative table image bit, used to create normative images in tables in articles or books',\n  },\n  [BitType.standardTableImageNonNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.tableImage,\n    description:\n      'Standard non-normative table image bit, used to create non-normative images in tables in articles or books',\n  },\n  [BitType.standardRemarkTableImageNormative]: {\n    since: '1.17.0',\n    baseBitType: BitType.tableImage,\n    description:\n      'Standard normative remark table image bit, used to create normative remark images in tables in articles or books',\n  },\n  [BitType.standardRemarkTableImageNonNormative]: {\n    since: '1.17.0',\n    baseBitType: BitType.tableImage,\n    description:\n      'Standard non-normative remark table image bit, used to create non-normative remark images in tables in articles or books',\n  },\n  [BitType.standardTableExtendedImageNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.tableExtendedImage,\n    description:\n      'Standard normative extended table image bit, used to create normative extended images in tables in articles or books',\n  },\n  [BitType.standardTableExtendedImageNonNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.tableExtendedImage,\n    description:\n      'Standard non-normative extended table image bit, used to create non-normative extended images in tables in articles or books',\n  },\n  [BitType.standardRemarkTableExtendedImageNormative]: {\n    since: '1.17.0',\n    baseBitType: BitType.tableExtendedImage,\n    description:\n      'Standard normative remark extended table image bit, used to create normative remark extended images in tables in articles or books',\n  },\n  [BitType.standardRemarkTableExtendedImageNonNormative]: {\n    since: '1.17.0',\n    baseBitType: BitType.tableExtendedImage,\n    description:\n      'Standard non-normative remark extended table image bit, used to create non-normative remark extended images in tables in articles or books',\n  },\n  [BitType.smartStandardTableImageNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardTableImageNormative,\n    description:\n      'Smart standard normative table image bit, used to create smart standard normative images in tables in articles or books',\n  },\n  [BitType.smartStandardTableImageNonNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardTableImageNonNormative,\n    description:\n      'Smart standard non-normative table image bit, used to create smart standard non-normative images in tables in articles or books',\n  },\n  [BitType.smartStandardRemarkTableImageNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardRemarkTableImageNormative,\n    description:\n      'Smart standard normative remark table image bit, used to create smart standard normative remark images in tables in articles or books',\n  },\n  [BitType.smartStandardRemarkTableImageNonNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardRemarkTableImageNonNormative,\n    description:\n      'Smart standard non-normative remark table image bit, used to create smart standard non-normative remark images in tables in articles or books',\n  },\n  [BitType.smartStandardTableExtendedImageNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardTableExtendedImageNormative,\n    description:\n      'Smart standard normative extended table image bit, used to create smart standard normative extended images in tables in articles or books',\n  },\n  [BitType.smartStandardTableExtendedImageNonNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardTableExtendedImageNonNormative,\n    description:\n      'Smart standard non-normative extended table image bit, used to create smart standard non-normative extended images in tables in articles or books',\n  },\n  [BitType.smartStandardRemarkTableExtendedImageNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardRemarkTableExtendedImageNormative,\n    description:\n      'Smart standard normative remark extended table image bit, used to create smart standard normative remark extended images in tables in articles or books',\n  },\n  [BitType.smartStandardRemarkTableExtendedImageNonNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardRemarkTableExtendedImageNonNormative,\n    description:\n      'Smart standard non-normative remark extended table image bit, used to create smart standard non-normative remark extended images in tables in articles or books',\n  },\n  [BitType.smartStandardTableImageNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardTableImageNormative,\n    description:\n      'Collapsible smart standard normative table image bit, used to create collapsible smart standard normative images in tables in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.smartStandardTableImageNonNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardTableImageNonNormative,\n    description:\n      'Collapsible smart standard non-normative table image bit, used to create collapsible smart standard non-normative images in tables in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.smartStandardRemarkTableImageNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardRemarkTableImageNormative,\n    description:\n      'Collapsible smart standard normative remark table image bit, used to create collapsible smart standard normative remark images in tables in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.smartStandardRemarkTableImageNonNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardRemarkTableImageNonNormative,\n    description:\n      'Collapsible smart standard non-normative remark table image bit, used to create collapsible smart standard non-normative remark images in tables in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.smartStandardTableExtendedImageNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardTableExtendedImageNormative,\n    description:\n      'Collapsible smart standard normative extended table image bit, used to create collapsible smart standard normative extended images in tables in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.smartStandardTableExtendedImageNonNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardTableExtendedImageNonNormative,\n    description:\n      'Collapsible smart standard non-normative extended table image bit, used to create collapsible smart standard non-normative extended images in tables in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.smartStandardRemarkTableExtendedImageNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardRemarkTableExtendedImageNormative,\n    description:\n      'Collapsible smart standard normative remark extended table image bit, used to create collapsible smart standard normative remark extended images in tables in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.smartStandardRemarkTableExtendedImageNonNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardRemarkTableExtendedImageNonNormative,\n    description:\n      'Collapsible smart standard non-normative remark extended table image bit, used to create collapsible smart standard non-normative remark extended images in tables in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.imageLink]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Image link bit, used to create links with images in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Resource bit tags for image links, used to define additional properties',\n      },\n      {\n        key: ConfigKey.group_resourceImageLink,\n        description: 'Resource image link tags, used to attach images to the link',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.imageOnDevice]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Image on device bit, used to create images stored on the device in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Resource bit tags for images on device, used to define additional properties',\n      },\n      {\n        key: ConfigKey.group_resourceImage,\n        description: 'Resource image tags for images on device, used to attach images',\n      },\n      {\n        key: ConfigKey.group_imageSource,\n        description:\n          'Image source tags for images on device, used to define the source of the image',\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.imageResponsive]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Responsive image bit, used to create responsive images in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description:\n          'Resource bit tags for responsive images, used to define additional properties',\n      },\n      {\n        // Combo resource\n\n        key: ConfigKey.group_resourceImageResponsive,\n        description: 'Resource image responsive tags, used to attach responsive images',\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.imagesLogoGrave]: {\n    since: '1.5.11',\n    baseBitType: BitType._standard,\n    description: 'Logo grave images bit, used to create logo grave images in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description:\n          'Resource bit tags for logo grave images, used to define additional properties',\n      },\n      {\n        // Image resource — fully-expanded shape (see BitType.extractorImage).\n        key: ConfigKey.group_resourceImageNoZoom,\n        description: 'Resource image tags for logo grave images, used to attach images',\n        exportJsonKey: { logos: [{ type: 'image', image: { src: '$' } }] },\n        minCount: 1,\n        maxCount: Count.infinity,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.prototypeImages]: {\n    since: '1.6.1',\n    baseBitType: BitType.imagesLogoGrave,\n    description: 'Prototype images bit, used to create prototype images in articles or books',\n    tags: [\n      {\n        // Override inherited `logos` wrapper with `images` for this bit type.\n        key: ConfigKey.group_resourceImageNoZoom,\n        description: 'Resource image tags for prototype images',\n        exportJsonKey: { images: [{ type: 'image', image: { src: '$' } }] },\n        minCount: 1,\n        maxCount: Count.infinity,\n      },\n    ],\n  },\n  [BitType.internalLink]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Internal link bit, used to create links to other bits in articles or books',\n    tags: [\n      {\n        exportJsonKey: { reference: '$' },\n        key: ConfigKey.tag_reference,\n        format: TagFormat.plainText,\n        description: 'Reference tag for the internal link, used to link to the target bit',\n      },\n    ],\n  },\n  [BitType.interview]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Interview bit, used to create interviews in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for interviews',\n      },\n      {\n        key: ConfigKey.property_reasonableNumOfChars,\n        exportJsonKey: {},\n        description: 'Reasonable number of characters for the interview, used to limit input size',\n        format: TagFormat.number,\n      },\n      {\n        // Override inherited @example: in `isTopLevelExample` allow-list.\n        key: ConfigKey.property_example,\n        exportJsonKey: [\n          { '@keyonly': { isExample: true } },\n          { '@absent': { isExample: true } },\n          { isExample: true, example: '$' },\n        ],\n        description: 'The example(s) for the bit',\n        format: TagFormat.bitmarkText,\n        nullable: true,\n      },\n    ],\n    cardSet: CardSetConfigKey.questions,\n  },\n  [BitType.interviewInstructionGrouped]: {\n    since: '1.3.0',\n    baseBitType: BitType.interview,\n    description: 'Grouped interview instruction bit',\n  },\n  [BitType.botInterview]: {\n    since: '1.3.0',\n    baseBitType: BitType.interview,\n    description: 'Bot interview bit, used to create bot interviews in articles or books',\n  },\n  [BitType.brandColor]: {\n    since: '4.12.0',\n    baseBitType: BitType._standard,\n    description: 'Brand color bit, used to define brand colors',\n    tags: [\n      {\n        key: ConfigKey.property_brandColor,\n        description: 'The brand color',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_brandColorName,\n        description: 'The brand color name',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.learningPathBook]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Learning path book bit, used to create learning paths in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_learningPathCommon,\n        description:\n          'Common tags for learning path books, used to define properties of learning paths',\n      },\n    ],\n  },\n  [BitType.bookLink]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Book link bit, used to create links to books in learning paths',\n  },\n  [BitType.bookLinkNext]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Next book link bit, used to create links to the next book in learning paths',\n  },\n  [BitType.bookLinkPrev]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description:\n      'Previous book link bit, used to create links to the previous book in learning paths',\n  },\n  [BitType.learningPathClassroomEvent]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description:\n      'Learning path classroom event bit, used to create classroom events in learning paths',\n  },\n  [BitType.learningPathClassroomTraining]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description:\n      'Learning path classroom training bit, used to create classroom training in learning paths',\n  },\n  [BitType.learningPathClosing]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Learning path closing bit, used to close learning paths',\n  },\n  [BitType.learningPathFeedback]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Learning path feedback bit, used to provide feedback in learning paths',\n  },\n  [BitType.learningPathLearningGoal]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Learning path learning goal bit, used to define learning goals in learning paths',\n  },\n  [BitType.learningPathLti]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Learning path LTI bit, used to integrate LTI tools in learning paths',\n  },\n  [BitType.learningPathSign]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Learning path sign bit, used to create signs in learning paths',\n  },\n  [BitType.learningPathStep]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Learning path step bit, used to create steps in learning paths',\n  },\n  [BitType.learningPathBotTraining]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Learning path bot training bit, used to create bot training in learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_bot,\n        description: 'Bot reference for the training, used to link to a specific bot',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.learningPathExternalLink]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Learning path external link bit, used to create external links in learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_externalLink,\n        description: 'External link for the learning path, used to link to external resources',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_externalLinkText,\n        description: 'Text for the external link, used to define the link text displayed',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.learningPathVideoCall]: {\n    since: '1.3.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Learning path video call bit, used to create video calls in learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_videoCallLink,\n        description: 'Video call link for the learning path, used to link to video calls',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.leLearningObjectives]: {\n    since: '1.25.0',\n    baseBitType: BitType.learningPathLearningGoal,\n    description: 'Learning objectives bit, used to define learning objectives in learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_activityType,\n        description: 'Activity type for the learning objectives, used to categorize the activity',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.leVideoCall]: {\n    since: '1.25.0',\n    baseBitType: BitType.learningPathVideoCall,\n    description: 'Video call bit, used to create video calls in learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_activityType,\n        description: 'Activity type for the video call, used to categorize the activity',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.leClassroomEvent]: {\n    since: '1.25.0',\n    baseBitType: BitType.learningPathClassroomEvent,\n    description: 'Classroom event bit, used to create classroom events in learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_activityType,\n        description: 'Activity type for the classroom event, used to categorize the activity',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.leMultiDayEvent]: {\n    since: '3.32.0',\n    baseBitType: BitType.leClassroomEvent,\n    description: 'Multi-day event bit, used to create multi-day events in learning paths',\n  },\n  [BitType.leCompletion]: {\n    since: '1.25.0',\n    baseBitType: BitType.learningPathClosing,\n    description: 'Completion bit, used to mark the completion of learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_activityType,\n        description: 'Activity type for the completion, used to categorize the activity',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.leExternalLink]: {\n    since: '1.25.0',\n    baseBitType: BitType.learningPathExternalLink,\n    description: 'External link bit, used to create external links in learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_activityType,\n        description: 'Activity type for the external link, used to categorize the activity',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.leReadBook]: {\n    since: '1.25.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Read book bit, used to create reading tasks in learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_activityType,\n        description: 'Activity type for the reading task, used to categorize the activity',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.leLearningStep]: {\n    since: '1.25.0',\n    baseBitType: BitType.learningPathStep,\n    description: 'Learning step bit, used to create steps in learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_activityType,\n        description: 'Activity type for the learning step, used to categorize the activity',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.lePreparationTask]: {\n    since: '1.26.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Preparation task bit, used to create preparation tasks in learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_activityType,\n        format: TagFormat.plainText,\n        description: 'Activity type for the preparation task, used to categorize the activity',\n      },\n    ],\n  },\n  [BitType.leRead]: {\n    since: '1.27.0',\n    baseBitType: BitType.lePreparationTask,\n    description: 'Read task bit, used to create reading tasks in learning paths',\n  },\n  [BitType.leTask]: {\n    since: '1.27.0',\n    baseBitType: BitType.lePreparationTask,\n    description: 'Task bit, used to create tasks in learning paths',\n  },\n  [BitType.leTodo]: {\n    since: '1.27.0',\n    baseBitType: BitType.lePreparationTask,\n    description: 'Todo bit, used to create todo tasks in learning paths',\n  },\n  [BitType.leFollowUpTask]: {\n    since: '1.27.0',\n    baseBitType: BitType.lePreparationTask,\n    description: 'Follow-up task bit, used to create follow-up tasks in learning paths',\n  },\n  [BitType.leFinishingTask]: {\n    since: '1.27.0',\n    baseBitType: BitType.lePreparationTask,\n    description: 'Finishing task bit, used to create finishing tasks in learning paths',\n  },\n  [BitType.leAssignment]: {\n    since: '1.27.0',\n    baseBitType: BitType.lePreparationTask,\n    description: 'Assignment bit, used to create assignments in learning paths',\n  },\n  [BitType.leWatchVideoEmbed]: {\n    since: '1.27.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Watch video embed bit, used to embed videos in learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_activityType,\n        description: 'Activity type for the video embed, used to categorize the activity',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Resource bit tags for video embeds, used to define additional properties',\n      },\n      {\n        key: ConfigKey.group_resourceVideoEmbed,\n        description: 'Resource video embed tags, used to attach video embeds to the bit',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.leListenAudioEmbed]: {\n    since: '1.27.0',\n    baseBitType: BitType.learningPathBook,\n    description: 'Listen audio embed bit, used to embed audio in learning paths',\n    tags: [\n      {\n        key: ConfigKey.property_activityType,\n        description: 'Activity type for the audio embed, used to categorize the activity',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Resource bit tags for audio embeds, used to define additional properties',\n      },\n      {\n        key: ConfigKey.group_resourceAudioEmbed,\n        description: 'Resource audio embed tags, used to attach audio embeds to the bit',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n\n  [BitType.listItem]: {\n    since: '1.22.0',\n    baseBitType: BitType.article,\n    description: 'List item bit, used to create list items in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_listItemIndent,\n        description:\n          'Indentation level for the list item, used to define the hierarchy of the list',\n        format: TagFormat.number,\n        defaultValue: '0',\n      },\n    ],\n  },\n  [BitType.standardListItem]: {\n    since: '1.22.0',\n    baseBitType: BitType.listItem,\n    description: 'Standard list item bit, used to create standard list items in articles or books',\n  },\n  [BitType.smartStandardListItem]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardListItem,\n    description:\n      'Smart standard list item bit, used to create smart standard list items in articles or books',\n    // PLAN-140 refs family (NISO import): one list-item bit per <ref> —\n    // CONTENT key (its citation subtree is the body), counter anchor scoped\n    // to the containing list, <label> → [%], nested <std-id> → [@externalId]\n    // (the externalId tag key's nested content slot).\n    mappingKeys: {\n      'xml-niso-iec': {\n        '@el': 'ref',\n        '@attr': { id: '$customerId' },\n        '@children': '$',\n        '▼': '$anchor',\n      },\n    },\n  },\n  [BitType.smartStandardListItemCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardListItem,\n    description:\n      'Collapsible smart standard list item bit, used to create collapsible smart standard list items in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.mark]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Mark bit, used to create marks in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for marks',\n      },\n      {\n        key: ConfigKey.group_markConfig,\n        description: 'Configuration tags for marks, used to define properties of marks',\n      },\n      {\n        key: ConfigKey.group_mark,\n        description: 'Mark tags, used to define the content of marks',\n      },\n      {\n        // Override inherited @example: in `isTopLevelExample` allow-list.\n        key: ConfigKey.property_example,\n        exportJsonKey: [\n          { '@keyonly': { isExample: true } },\n          { '@absent': { isExample: true } },\n          { isExample: true, example: '$' },\n        ],\n        description: 'The example(s) for the bit',\n        format: TagFormat.bitmarkText,\n        nullable: true,\n      },\n    ],\n  },\n  [BitType.match]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Match bit, used to create matching pairs in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for matching pairs',\n      },\n      {\n        key: ConfigKey.property_isCaseSensitive,\n        exportJsonKey: {},\n        description:\n          'Case sensitivity for matching pairs, used to define if matches are case-sensitive',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n      {\n        // Override inherited @example: in `isTopLevelExample` allow-list\n        // (covers match, matchAll, matchReverse, matchAllReverse,\n        // matchSolutionGrouped, matchMatrix, matchAudio, matchPicture).\n        // Bit-level fires emit only `isExample`; the @example value (when\n        // provided) is recorded in the ancestor stack and consumed by\n        // per-pair/per-cell variant overrides — not surfaced at bit scope.\n        key: ConfigKey.property_example,\n        exportJsonKey: [\n          { '@keyonly': { isExample: true } },\n          { '@absent': { isExample: true } },\n          { isExample: true },\n        ],\n        description: 'The example(s) for the bit',\n        format: TagFormat.bitmarkText,\n        nullable: true,\n      },\n    ],\n    cardSet: CardSetConfigKey.matchPairs,\n  },\n  [BitType.matchAll]: {\n    since: '1.3.0',\n    baseBitType: BitType.match,\n    description:\n      'Match all bit, used to create matching pairs with all options in articles or books',\n  },\n  [BitType.matchReverse]: {\n    since: '1.3.0',\n    baseBitType: BitType.match,\n    description:\n      'Match reverse bit, used to create matching pairs with reversed options in articles or books',\n  },\n  [BitType.matchAllReverse]: {\n    since: '1.3.0',\n    baseBitType: BitType.match,\n    description:\n      'Match all reverse bit, used to create matching pairs with all options and reversed in articles or books',\n  },\n  [BitType.matchSolutionGrouped]: {\n    since: '1.3.0',\n    baseBitType: BitType.match,\n    description:\n      'Grouped match solution bit, used to create grouped matching solutions in articles or books',\n  },\n  [BitType.matchMatrix]: {\n    since: '1.3.0',\n    baseBitType: BitType.match,\n    description:\n      'Match matrix bit, used to create matching pairs in a matrix format in articles or books',\n    cardSet: CardSetConfigKey.matchMatrix,\n  },\n  [BitType.matchAudio]: {\n    since: '1.3.0',\n    baseBitType: BitType.match,\n    description: 'Match audio bit, used to create matching pairs with audio in articles or books',\n    cardSet: CardSetConfigKey.matchAudioPairs,\n  },\n  [BitType.matchPicture]: {\n    since: '1.3.0',\n    baseBitType: BitType.match,\n    description:\n      'Match picture bit, used to create matching pairs with pictures in articles or books',\n    cardSet: CardSetConfigKey.matchImagePairs,\n  },\n  [BitType.feedback]: {\n    since: '3.13.0',\n    baseBitType: BitType._standard,\n    description: 'Feedback bit, used to provide feedback in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_reasonableNumOfChars,\n        exportJsonKey: {},\n        description: 'Reasonable number of characters for feedback, used to limit input size',\n        format: TagFormat.number,\n      },\n    ],\n    cardSet: CardSetConfigKey.feedback,\n  },\n  [BitType.learningDocumentationFeedback]: {\n    since: '3.13.0',\n    baseBitType: BitType.feedback,\n    description: 'Feedback for learning documentation',\n  },\n  [BitType.handInFeedbackExpert]: {\n    since: '3.30.0',\n    baseBitType: BitType.feedback,\n    description: 'Feedback for expert hand-in',\n  },\n  [BitType.handInFeedbackSelf]: {\n    since: '3.30.0',\n    baseBitType: BitType.feedback,\n    description: 'Self-feedback for hand-in',\n  },\n  [BitType.multipleChoice1]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Multiple choice 1 bit, used to create single-choice questions in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for multiple choice 1 questions',\n      },\n      {\n        key: ConfigKey.group_trueFalse,\n        description: 'True/False tags for multiple choice 1 questions',\n      },\n      {\n        // Override inherited @example: in `isTopLevelExample` allow-list.\n        key: ConfigKey.property_example,\n        exportJsonKey: [\n          { '@keyonly': { isExample: true } },\n          { '@absent': { isExample: true } },\n          { isExample: true, example: '$' },\n        ],\n        description: 'The example(s) for the bit',\n        format: TagFormat.bitmarkText,\n        nullable: true,\n      },\n    ],\n  },\n  [BitType.coachSelfReflectionMultipleChoice1]: {\n    since: '1.3.0',\n    baseBitType: BitType.multipleChoice1,\n    description:\n      'Coach self-reflection multiple choice 1 bit, used for self-reflection in coaching',\n  },\n  [BitType.multipleChoice]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Multiple choice bit, used to create multiple-choice questions in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for multiple choice questions',\n      },\n      {\n        key: ConfigKey.group_trueFalse,\n        description: 'True/False tags for multiple choice questions',\n      }, // This is actually for multiple-choice-1, but we support it here as well (as many bits are wrong)\n      {\n        // Override inherited @example: in `isTopLevelExample` allow-list.\n        key: ConfigKey.property_example,\n        exportJsonKey: [\n          { '@keyonly': { isExample: true } },\n          { '@absent': { isExample: true } },\n          { isExample: true, example: '$' },\n        ],\n        description: 'The example(s) for the bit',\n        format: TagFormat.bitmarkText,\n        nullable: true,\n      },\n    ],\n    cardSet: CardSetConfigKey.quiz,\n  },\n  [BitType.coachSelfReflectionMultipleChoice]: {\n    since: '1.3.0',\n    baseBitType: BitType.multipleChoice,\n    description: 'Coach self-reflection multiple choice bit, used for self-reflection in coaching',\n  },\n  [BitType.multipleChoiceText]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Multiple choice text bit, used to create multiple-choice questions with text in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for multiple choice text questions',\n      },\n      {\n        key: ConfigKey.group_trueFalseInlineSelect,\n        description: 'True/False tags for multiple choice text questions',\n      },\n      {\n        // Override inherited @example: in `isTopLevelExample` allow-list.\n        key: ConfigKey.property_example,\n        exportJsonKey: [\n          { '@keyonly': { isExample: true } },\n          { '@absent': { isExample: true } },\n          { isExample: true, example: '$' },\n        ],\n        description: 'The example(s) for the bit',\n        format: TagFormat.bitmarkText,\n        nullable: true,\n      },\n    ],\n  },\n  [BitType.coachCallToActionMultipleChoiceText]: {\n    since: '1.3.0',\n    baseBitType: BitType.multipleChoiceText,\n    description:\n      'Coach call to action multiple choice text bit, used for self-reflection in coaching',\n  },\n  [BitType.coachSelfReflectionMultipleChoiceText]: {\n    since: '1.3.0',\n    baseBitType: BitType.multipleChoiceText,\n    description:\n      'Coach self-reflection multiple choice text bit, used for self-reflection in coaching',\n  },\n  [BitType.multipleResponse1]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Multiple response 1 bit, used to create multiple-response questions in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for multiple response 1 questions',\n      },\n      {\n        key: ConfigKey.group_trueFalseResponses,\n        description: 'True/False tags for multiple response 1 questions',\n      },\n      {\n        // Override inherited @example: in `isTopLevelExample` allow-list.\n        key: ConfigKey.property_example,\n        exportJsonKey: [\n          { '@keyonly': { isExample: true } },\n          { '@absent': { isExample: true } },\n          { isExample: true, example: '$' },\n        ],\n        description: 'The example(s) for the bit',\n        format: TagFormat.bitmarkText,\n        nullable: true,\n      },\n    ],\n  },\n  [BitType.coachSelfReflectionMultipleResponse1]: {\n    since: '1.3.0',\n    baseBitType: BitType.multipleResponse1,\n    description:\n      'Coach self-reflection multiple response 1 bit, used for self-reflection in coaching',\n  },\n  [BitType.multipleResponse]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Multiple response bit, used to create multiple-response questions in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for multiple response questions',\n      },\n      {\n        key: ConfigKey.group_trueFalseResponses,\n        description: 'True/False tags for multiple response questions',\n      }, // This is actually for multiple-response-1, but we support it here as well (as many bits are wrong)\n      {\n        // Override inherited @example: in `isTopLevelExample` allow-list.\n        key: ConfigKey.property_example,\n        exportJsonKey: [\n          { '@keyonly': { isExample: true } },\n          { '@absent': { isExample: true } },\n          { isExample: true, example: '$' },\n        ],\n        description: 'The example(s) for the bit',\n        format: TagFormat.bitmarkText,\n        nullable: true,\n      },\n    ],\n    cardSet: CardSetConfigKey.quizResponses,\n  },\n  [BitType.coachSelfReflectionMultipleResponse]: {\n    since: '1.3.0',\n    baseBitType: BitType.multipleResponse,\n    description:\n      'Coach self-reflection multiple response bit, used for self-reflection in coaching',\n  },\n  [BitType.page]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Page bit, used to create pages in articles or books',\n    tags: [\n      {\n        maxCount: 2,\n        jsonKey: 'title|multi(count=2, key=subtitle)',\n        exportJsonKey: [{ '@level=1': { title: '$' } }, { '@level=2': { subtitle: '$' } }],\n        key: ConfigKey.tag_title,\n        description: 'Title of the page, used to display the page title',\n      },\n      {\n        key: ConfigKey.property_thumbImage,\n        description: 'Thumbnail image for the page, used to display a small image representation',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.pageCollapsible]: {\n    since: '1.30.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.page,\n    description: 'Collapsible page bit, used to create collapsible sections in pages',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.pageCoverImage]: {\n    since: '1.22.0',\n    baseBitType: BitType.page,\n    description: 'Page cover image bit, used to create cover images for pages',\n  },\n  [BitType.advertisingAdvertorialPage]: {\n    since: '4.5.0',\n    baseBitType: BitType.page,\n    description: 'Advertorial Page bit, used to create advertorial pages',\n  },\n  [BitType.pageBuyButton]: {\n    since: '1.4.3',\n    baseBitType: BitType._standard,\n    description: 'Page buy button bit, used to create buy buttons on pages',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description: 'Slug for the page, used to identify the page in URLs',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_content2Buy,\n        description: 'Content to buy for the page, used to define what is being sold',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'Caption for the buy button, used to define the text displayed on the button',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.pageBuyButtonAlt]: {\n    since: '1.31.0',\n    baseBitType: BitType.pageBuyButton,\n    description: 'Alternative page buy button bit, used to create alternative buy buttons on pages',\n  },\n  [BitType.pageBuyButtonPromotion]: {\n    since: '1.5.11',\n    baseBitType: BitType.pageBuyButton,\n    description: 'Page buy button for promotions, used to create buy buttons on promotional pages',\n  },\n  [BitType.pageSubpage]: {\n    since: '1.6.6',\n    baseBitType: BitType._standard,\n    description: 'Page subpage bit, used to create subpages in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description: 'Slug for the subpage, used to identify the subpage in URLs',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_page,\n        description: 'Page reference for the subpage, used to link to the parent page',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.pageShopInShop]: {\n    since: '1.6.6',\n    baseBitType: BitType.pageSubpage,\n    description: 'Page shop-in-shop bit, used to create shop-in-shop pages in articles or books',\n  },\n  [BitType.pageCategory]: {\n    since: '1.6.6',\n    baseBitType: BitType.pageSubpage,\n    description: 'Page category bit, used to create category pages in articles or books',\n  },\n  [BitType.pageAcademy]: {\n    since: '1.6.6',\n    baseBitType: BitType.pageSubpage,\n    description: 'Page academy bit, used to create academy pages in articles or books',\n  },\n  [BitType.pagePromotion]: {\n    since: '1.6.6',\n    baseBitType: BitType.pageSubpage,\n    description: 'Page promotion bit, used to create promotional pages in articles or books',\n  },\n  [BitType.pageSpecial]: {\n    since: '1.6.6',\n    baseBitType: BitType.pageSubpage,\n    description: 'Page special bit, used to create special pages in articles or books',\n  },\n  [BitType.pageEnd]: {\n    since: '5.33.0',\n    baseBitType: BitType.article,\n    description: 'Page end bit, used to mark the end of a page section in articles or books',\n  },\n  [BitType.pageStart]: {\n    since: '5.33.0',\n    baseBitType: BitType.article,\n    description: 'Page start bit, used to mark the start of a page section in articles or books',\n  },\n  [BitType.pagePerson]: {\n    since: '1.5.16',\n    baseBitType: BitType._standard,\n    description: 'Page person bit, used to create person pages in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description: 'Slug for the person page, used to identify the person in URLs',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.group_person,\n        description: 'Person tags, used to define properties of the person',\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'Caption for the button on the person page, used to define the text displayed',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.pageProduct]: {\n    since: '1.4.17',\n    baseBitType: BitType._standard,\n    description: 'Page product bit, used to create product pages in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description: 'Slug for the product page, used to identify the product in URLs',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_product,\n        description: 'Product reference for the product page, used to link to the product',\n        format: TagFormat.plainText,\n        nullable: true,\n      },\n    ],\n  },\n  [BitType.pageProductList]: {\n    since: '1.4.17',\n    baseBitType: BitType._standard,\n    description: 'Page product list bit, used to create product lists in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description: 'Slug for the product list page, used to identify the product list in URLs',\n        format: TagFormat.plainText,\n      },\n      // NOTE: Only one of productVideo or productVideoList should be used, not both - TODO: fix when know which one!\n      {\n        key: ConfigKey.property_product,\n        description: 'Product reference for the product list, used to link to the product',\n        format: TagFormat.plainText,\n        nullable: true,\n        maxCount: Count.infinity,\n      },\n      // {\n      //   key: ConfigKey.property_productList,\n      //   format: TagFormat.plainText,\n      //   maxCount: Count.infinity,\n      // },\n    ],\n  },\n  [BitType.pageProductVideo]: {\n    since: '1.4.17',\n    baseBitType: BitType._standard,\n    description: 'Page product video bit, used to create product video pages in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description: 'Slug for the product video page, used to identify the product video in URLs',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_productVideo,\n        description:\n          'Product video reference for the product video page, used to link to the video',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.pageProductVideoList]: {\n    since: '1.4.17',\n    baseBitType: BitType._standard,\n    description:\n      'Page product video list bit, used to create product video lists in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description:\n          'Slug for the product video list page, used to identify the product video list in URLs',\n        format: TagFormat.plainText,\n      },\n      // NOTE: Only one of productVideo or productVideoList should be used, not both - TODO: fix when know which one!\n      {\n        key: ConfigKey.property_productVideo,\n        description:\n          'Product video reference for the product video list, used to link to the video',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      // {\n      //   key: ConfigKey.property_productVideoList,\n      //   format: TagFormat.plainText,\n      //   maxCount: Count.infinity,\n      // },\n    ],\n  },\n  [BitType.pageSectionFolder]: {\n    since: '1.4.17',\n    baseBitType: BitType._standard,\n    description: 'Page section folder bit, used to create section folders in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_slug,\n        description: 'Slug for the section folder page, used to identify the section in URLs',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_productFolder,\n        description:\n          'Product folder reference for the section folder page, used to link to the folder',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.photo]: {\n    since: '1.3.0',\n    baseBitType: BitType.image,\n    description: 'Photo bit, used to create photo bits in articles or books',\n  },\n  [BitType.platform]: {\n    since: '4.12.0',\n    baseBitType: BitType._standard,\n    description: 'Platform bit, used to define platform properties',\n    tags: [\n      {\n        key: ConfigKey.property_platformName,\n        description: 'The platform name',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.resource_platformIcon,\n        jsonKey: 'platformIcon|resource(type=image, key=image)',\n        exportJsonKey: { platformIcon: { type: 'image', image: { src: '$' } } },\n        description: 'The platform icon',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the platform icon resource',\n          },\n        ],\n        maxCount: 1,\n      },\n      {\n        key: ConfigKey.group_platformStylesCommon,\n        description: 'Common platform styles',\n      },\n    ],\n  },\n  [BitType.platformBrandTarget]: {\n    since: '4.15.0',\n    baseBitType: BitType._standard,\n    description: 'Platform brand target bit, used to define the brand target for publishing',\n    tags: [\n      {\n        key: ConfigKey.property_platformBrandTarget,\n        description: 'The platform brand target (typically \"light\", \"dark\" or \"none\")',\n        format: TagFormat.plainText,\n        defaultValue: 'none',\n      },\n    ],\n  },\n  [BitType.platformHeader]: {\n    since: '4.12.0',\n    baseBitType: BitType._standard,\n    description: 'Platform header bit, used to define platform header properties',\n    tags: [\n      {\n        key: ConfigKey.resource_platformLogo,\n        jsonKey: 'platformLogo|resource(type=image, key=image)',\n        exportJsonKey: { platformLogo: { type: 'image', image: { src: '$' } } },\n        description: 'The platform logo',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the platform logo resource',\n          },\n        ],\n        maxCount: 1,\n      },\n      {\n        key: ConfigKey.property_platformLogoMaxHeight,\n        description: 'Maximum height for the platform logo',\n        format: TagFormat.number,\n        defaultValue: '40',\n      },\n      {\n        key: ConfigKey.group_platformStylesCommon,\n        description: 'Common platform styles',\n      },\n    ],\n  },\n  [BitType.platformMain]: {\n    since: '4.12.0',\n    baseBitType: BitType._standard,\n    description: 'Platform main bit, used to define platform main properties',\n    tags: [\n      {\n        key: ConfigKey.group_platformStylesCommon,\n        description: 'Common platform styles',\n      },\n    ],\n  },\n  [BitType.platformMainButton]: {\n    since: '4.12.0',\n    baseBitType: BitType._standard,\n    description: 'Platform main button bit, used to define platform main button properties',\n    tags: [\n      {\n        key: ConfigKey.group_platformStylesCommon,\n        description: 'Common platform styles',\n      },\n    ],\n  },\n  [BitType.platformMainInput]: {\n    since: '4.12.0',\n    baseBitType: BitType._standard,\n    description: 'Platform main input bit, used to define platform main input properties',\n    tags: [\n      {\n        key: ConfigKey.group_platformStylesCommon,\n        description: 'Common platform styles',\n      },\n    ],\n  },\n  [BitType.platformSection]: {\n    since: '4.12.0',\n    baseBitType: BitType._standard,\n    description: 'Platform section bit, used to define platform section properties',\n    tags: [\n      {\n        key: ConfigKey.group_platformStylesCommon,\n        description: 'Common platform styles',\n      },\n    ],\n  },\n  [BitType.platformSectionButton]: {\n    since: '4.12.0',\n    baseBitType: BitType._standard,\n    description: 'Platform section button bit, used to define platform section button properties',\n    tags: [\n      {\n        key: ConfigKey.group_platformStylesCommon,\n        description: 'Common platform styles',\n      },\n    ],\n  },\n  [BitType.platformSectionChat]: {\n    since: '4.12.0',\n    baseBitType: BitType._standard,\n    description: 'Platform section chat bit, used to define platform section chat properties',\n    tags: [\n      {\n        key: ConfigKey.group_platformStylesCommon,\n        description: 'Common platform styles',\n      },\n      {\n        key: ConfigKey.resource_platformBackgroundImage,\n        jsonKey: 'platformBackgroundImage|resource(type=image, key=image)',\n        exportJsonKey: { platformBackgroundImage: { type: 'image', image: { src: '$' } } },\n        description: 'The platform section chat background image',\n        chain: [\n          {\n            key: ConfigKey.group_resourceImageCommon,\n            description: 'Common image properties for the platform background image resource',\n          },\n        ],\n      },\n    ],\n  },\n  [BitType.platformSectionHeader]: {\n    since: '4.12.0',\n    baseBitType: BitType._standard,\n    description: 'Platform section header bit, used to define platform section header properties',\n    tags: [\n      {\n        key: ConfigKey.group_platformStylesCommon,\n        description: 'Common platform styles',\n      },\n    ],\n  },\n  [BitType.platformSectionInput]: {\n    since: '4.12.0',\n    baseBitType: BitType._standard,\n    description: 'Platform section input bit, used to define platform section input properties',\n    tags: [\n      {\n        key: ConfigKey.group_platformStylesCommon,\n        description: 'Common platform styles',\n      },\n    ],\n  },\n  [BitType.platformSystemIcon]: {\n    since: '4.12.0',\n    baseBitType: BitType._standard,\n    description: 'Platform system icon bit, used to define platform system icon properties',\n    tags: [\n      {\n        key: ConfigKey.group_platformStylesCommon,\n        description: 'Common platform styles',\n      },\n    ],\n  },\n  [BitType.quote]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Quote bit, used to create quotes in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_quotedPerson,\n        description: 'Quoted person for the quote, used to define who is being quoted',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.rating]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Rating bit, used to create rating bits in articles or books',\n  },\n  [BitType.coachSelfReflectionRating]: {\n    since: '1.3.0',\n    baseBitType: BitType.rating,\n    description: 'Coach self-reflection rating bit, used for self-reflection in coaching',\n  },\n  [BitType.releaseNote]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Release note bit, used to create release notes in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_releaseVersion,\n        description:\n          'Release version for the release note, used to define the version of the release',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_releaseKind,\n        description: 'Release kind for the release note, used to define the type of release',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_releaseDate,\n        description: 'Release date for the release note, used to define when the release was made',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.reviewNote]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Review note bit, used to create review notes in articles or books',\n    tags: [\n      {\n        maxCount: 2,\n        jsonKey: 'title|multi(count=2, key=subtitle)',\n        exportJsonKey: [{ '@level=1': { title: '$' } }, { '@level=2': { subtitle: '$' } }],\n        key: ConfigKey.tag_title,\n        description: 'Title of the review note, used to display the note title',\n      },\n      {\n        key: ConfigKey.property_resolved,\n        description:\n          'Resolved status for the review note, used to indicate if the note is resolved',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_resolvedDate,\n        description: 'Resolved date for the review note, used to define when the note was resolved',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_resolvedBy,\n        description: 'Resolved by for the review note, used to define who resolved the note',\n        format: TagFormat.plainText,\n      },\n      {\n        // Override inherited @example from group_standardTags: string root example.\n        key: ConfigKey.property_example,\n        exportJsonKey: [\n          { '@keyonly': { isExample: true, example: 'true' } },\n          { '@absent': { isExample: true, example: 'true' } },\n          { isExample: true, example: '$' },\n        ],\n        description: 'The example text for the review note bit',\n        format: TagFormat.plainText,\n        nullable: true,\n      },\n    ],\n    rootExampleType: ExampleType.string,\n  },\n  [BitType.reviewAuthorNote]: {\n    since: '1.3.0',\n    baseBitType: BitType.reviewNote,\n    description: 'Author review note bit, used to create author notes in reviews',\n  },\n  [BitType.reviewCustomerNote]: {\n    //\n    since: '3.5.0',\n    baseBitType: BitType.reviewNote,\n    description: 'Customer review note bit, used to create customer notes in reviews',\n  },\n  [BitType.reviewError]: {\n    since: '5.8.0',\n    baseBitType: BitType.reviewNote,\n    description: 'Review error note bit, used to create error notes in reviews',\n  },\n  [BitType.reviewErrorAi]: {\n    since: '5.8.0',\n    baseBitType: BitType.reviewNote,\n    description: 'Review error AI note bit, used to create AI error notes in reviews',\n  },\n  [BitType.reviewErrorTranslation]: {\n    since: '5.8.0',\n    baseBitType: BitType.reviewNote,\n    description:\n      'Review error translation note bit, used to create translation error notes in reviews',\n  },\n  [BitType.reviewReviewerNote]: {\n    since: '1.3.0',\n    baseBitType: BitType.reviewNote,\n    description: 'Reviewer review note bit, used to create reviewer notes in reviews',\n  },\n  [BitType.reviewRequestForReviewNote]: {\n    since: '1.3.0',\n    baseBitType: BitType.reviewNote,\n    description: 'Request for review note bit, used to create notes requesting reviews',\n  },\n  [BitType.reviewApprovedNote]: {\n    since: '1.3.0',\n    baseBitType: BitType.reviewNote,\n    description: 'Approved review note bit, used to create notes for approved reviews',\n  },\n  [BitType.sampleSolution]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Sample solution bit, used to create sample solutions in articles or books',\n    tags: [\n      // Not sure if these are actually valid here, but include them as they are in the test bit.\n      {\n        exportJsonKey: { anchor: '$' },\n        key: ConfigKey.tag_anchor,\n        format: TagFormat.plainText,\n        description: 'Anchor for the sample solution, used to link to the solution',\n      },\n      {\n        exportJsonKey: { reference: '$' },\n        key: ConfigKey.tag_reference,\n        format: TagFormat.plainText,\n        description:\n          'Reference for the sample solution, used to link to the source of the solution',\n      },\n    ],\n  },\n\n  [BitType.sequence]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Sequence bit, used to create sequences in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for sequences',\n      },\n      {\n        // Override inherited @example from group_standardTags: this bit has\n        // a boolean root example (rootExampleType: boolean), so bit-level\n        // [@example] writes `example: true` in addition to `isExample: true`.\n        key: ConfigKey.property_example,\n        exportJsonKey: [\n          { '@keyonly': { isExample: true, example: true } },\n          { '@absent': { isExample: true, example: true } },\n          { isExample: true, example: '$' },\n        ],\n        description: 'The example flag for the bit (boolean)',\n        format: TagFormat.boolean,\n        nullable: true,\n      },\n    ],\n    cardSet: CardSetConfigKey.elements,\n    rootExampleType: ExampleType.boolean,\n  },\n  [BitType.stillImageFilm]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Still image film bit, used to create still image films in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description:\n          'Resource bit tags for still image films, used to define additional properties',\n      },\n      {\n        // Combo resource\n\n        key: ConfigKey.group_resourceStillImageFilm,\n        description: 'Resource still image film tags, used to attach still image films to the bit',\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.stillImageFilmEmbed]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Still image film embed bit, used to embed still image films in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description:\n          'Resource bit tags for still image films, used to define additional properties',\n      },\n      {\n        key: ConfigKey.group_resourceStillImageFilmEmbed,\n        description:\n          'Resource still image film embed tags, used to attach still image films to the bit',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.stillImageFilmLink]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Still image film link bit, used to create still image film links in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description:\n          'Resource bit tags for still image films, used to define additional properties',\n      },\n      {\n        key: ConfigKey.group_resourceStillImageFilmLink,\n        description:\n          'Resource still image film link tags, used to attach still image films to the bit',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.surveyAnonymous]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Anonymous survey bit, used to create anonymous surveys in articles or books',\n  },\n  [BitType.survey]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Survey bit, used to create surveys in articles or books',\n  },\n  [BitType.surveyMatrix]: {\n    since: '1.6.2',\n    baseBitType: BitType.image,\n    description: 'Survey matrix bit, used to create survey matrices in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_pointerTop,\n        description: 'Pointer for the top of the survey matrix, used to define the top label',\n        format: TagFormat.plainText,\n        minCount: 1,\n        maxCount: 1,\n      },\n      {\n        key: ConfigKey.property_pointerLeft,\n        description: 'Pointer for the left of the survey matrix, used to define the left label',\n        format: TagFormat.plainText,\n        minCount: 1,\n        maxCount: 1,\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'Caption for the button in the survey matrix, used to define the button text',\n        format: TagFormat.plainText,\n        minCount: 1,\n        maxCount: 1,\n      },\n    ],\n  },\n  [BitType.surveyMatrixMe]: {\n    since: '1.6.2',\n    baseBitType: BitType.surveyMatrix,\n    description:\n      'Survey matrix me bit, used to create personal survey matrices in articles or books',\n  },\n  [BitType.surveyRating]: {\n    since: '1.6.0',\n    baseBitType: BitType._standard,\n    description: 'Survey rating bit, used to create rating surveys in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_ratingLevelStart,\n        jsonKey: 'ratingLevelStart.level',\n        exportJsonKey: { ratingLevelStart: { level: '$' } },\n        description: 'Start level for the rating survey, used to define the lowest rating',\n        format: TagFormat.number,\n        chain: [\n          {\n            key: ConfigKey.property_label,\n            description:\n              'Label for the start level of the rating survey, used to define the text displayed',\n            format: TagFormat.bitmarkText,\n          },\n        ],\n      },\n      {\n        key: ConfigKey.property_ratingLevelEnd,\n        jsonKey: 'ratingLevelEnd.level',\n        exportJsonKey: { ratingLevelEnd: { level: '$' } },\n        description: 'End level for the rating survey, used to define the highest rating',\n        format: TagFormat.number,\n        chain: [\n          {\n            key: ConfigKey.property_label,\n            description:\n              'Label for the end level of the rating survey, used to define the text displayed',\n            format: TagFormat.bitmarkText,\n          },\n        ],\n      },\n      {\n        key: ConfigKey.property_ratingLevelSelected,\n        description: 'Selected level for the rating survey, used to define the default rating',\n        format: TagFormat.number,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description: 'Caption for the button in the rating survey, used to define the button text',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.surveyRatingOnce]: {\n    since: '1.6.0',\n    baseBitType: BitType.surveyRating,\n    description:\n      'Survey rating once bit, used to create one-time rating surveys in articles or books',\n  },\n  [BitType.surveyRatingDisplay]: {\n    since: '1.6.0',\n    baseBitType: BitType.surveyRating,\n    description: 'Survey rating display bit, used to display rating surveys in articles or books',\n  },\n  [BitType.scorm]: {\n    since: '1.5.11',\n    baseBitType: BitType._standard,\n    description: 'SCORM bit, used to embed SCORM content in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_scormSource,\n        description: 'Source for the SCORM content, used to define the SCORM package URL',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_posterImage,\n        description: 'Poster image for the SCORM content, used to display a preview image',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.pronunciationTable]: {\n    since: '3.1.0',\n    baseBitType: BitType._standard,\n    description:\n      'Pronunciation table bit, used to create pronunciation tables in articles or books',\n\n    cardSet: CardSetConfigKey.pronunciationTable,\n  },\n  [BitType.table]: {\n    since: '1.5.19',\n    baseBitType: BitType._standard,\n    description: 'Table bit, used to create tables in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_caption,\n        description: 'Caption for the table, used to define the title of the table',\n        format: TagFormat.bitmarkText,\n        // HTML-10 / HTML-C2: a bit-level caption renders as the table's\n        // `<caption>` — placed inside the idiomatic `<table>` container as\n        // its first child. Outside a table context it falls back to the\n        // residual carrier.\n        htmlKey: { '@el': 'caption', '@children': '$' },\n        // PLAN-141 F2 (NISO import): a table-wrap's <caption><title> — the\n        // nested content slot reads the title text (catalog D5: the caption\n        // is a TOP-LEVEL bit property on table bits).\n        mappingKeys: {\n          'xml-niso-iec': { '@el': 'caption', '@children': { '@el': 'title', '@text': '$' } },\n        },\n      },\n      {\n        key: ConfigKey.property_tableFixedHeader,\n        description: 'Fixed header for the table, used to keep the header visible while scrolling',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_tableHeaderWhitespaceNoWrap,\n        description: 'No wrap for table header whitespace, used to prevent header text wrapping',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_tableSearch,\n        description:\n          'Search functionality for the table, used to enable searching within the table',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_tableSort,\n        description: 'Sorting functionality for the table, used to enable sorting of table columns',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_tablePagination,\n        description: 'Pagination for the table, used to limit the number of rows displayed at once',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_tablePaginationLimit,\n        description: 'Pagination limit for the table, used to define the number of rows per page',\n        format: TagFormat.number,\n        defaultValue: '0',\n      },\n      {\n        key: ConfigKey.property_tableHeight,\n        description: 'Height for the table, used to define the height of the table in pixels',\n        format: TagFormat.number,\n        defaultValue: '0',\n      },\n      {\n        key: ConfigKey.property_tableWhitespaceNoWrap,\n        description: 'No wrap for table whitespace, used to prevent text wrapping in table cells',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_tableAutoWidth,\n        description: 'Auto width for table columns, used to automatically adjust column widths',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n      {\n        key: ConfigKey.property_tableResizableColumns,\n        description: 'Resizable columns for the table, used to allow users to resize table columns',\n        format: TagFormat.boolean,\n        defaultValue: 'false',\n      },\n      {\n        key: ConfigKey.property_tableColumnMinWidth,\n        description: 'Minimum width for table columns, used to define the minimum width of columns',\n        format: TagFormat.number,\n        defaultValue: '0',\n      },\n    ],\n    cardSet: CardSetConfigKey.table,\n  },\n  [BitType.tableExtended]: {\n    since: '4.14.0',\n    baseBitType: BitType.table,\n    description: 'Extended table bit, used to create complex tables with all HTML table features',\n    cardSet: CardSetConfigKey.tableExtended,\n  },\n  [BitType.tableExtendedImage]: {\n    since: '5.13.0',\n    baseBitType: BitType.tableExtended,\n    description:\n      'Extended table image bit, used to create complex tables with images and all HTML table features',\n    tags: [\n      {\n        key: ConfigKey.property_caption,\n        description: 'Caption for the table image, used to provide a description for the image',\n        format: TagFormat.bitmarkText,\n        // HTML-10 / HTML-C2: render as the table's `<caption>` (see table bit).\n        htmlKey: { '@el': 'caption', '@children': '$' },\n      },\n      {\n        key: ConfigKey.group_backgroundWallpaper,\n        description:\n          'Background wallpaper tags for images, used to define background properties for images',\n      },\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description:\n          'Resource bit tags for images, used to define additional properties for images',\n      },\n      {\n        key: ConfigKey.group_resourceImage,\n        description: 'Resource image tags for images, used to attach images to the bit',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.tableAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.table,\n    description: 'Alternative table bit, used to create alternative tables in articles or books',\n  },\n  [BitType.standardTableNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.table,\n    description:\n      'Standard normative table bit, used to create standard normative tables in articles or books',\n  },\n  [BitType.standardTableNonNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.table,\n    description:\n      'Standard non-normative table bit, used to create standard non-normative tables in articles or books',\n  },\n  [BitType.standardRemarkTableNormative]: {\n    since: '1.17.0',\n    baseBitType: BitType.table,\n    description:\n      'Standard normative remark table bit, used to create standard normative remark tables in articles or books',\n  },\n  [BitType.standardRemarkTableNonNormative]: {\n    since: '1.17.0',\n    baseBitType: BitType.table,\n    description:\n      'Standard non-normative remark table bit, used to create standard non-normative remark tables in articles or books',\n  },\n  [BitType.standardTableExtendedNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.tableExtended,\n    description:\n      'Standard normative extended table bit, used to create standard normative extended tables in articles or books',\n  },\n  [BitType.standardTableExtendedNonNormative]: {\n    since: '1.16.0',\n    baseBitType: BitType.tableExtended,\n    description:\n      'Standard non-normative extended table bit, used to create standard non-normative extended tables in articles or books',\n  },\n  [BitType.standardRemarkTableExtendedNormative]: {\n    since: '1.17.0',\n    baseBitType: BitType.tableExtended,\n    description:\n      'Standard normative remark extended table bit, used to create standard normative remark extended tables in articles or books',\n  },\n  [BitType.standardRemarkTableExtendedNonNormative]: {\n    since: '1.17.0',\n    baseBitType: BitType.tableExtended,\n    description:\n      'Standard non-normative remark extended table bit, used to create standard non-normative remark extended tables in articles or books',\n  },\n  [BitType.smartStandardTableNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardTableNormative,\n    description:\n      'Smart standard normative table bit, used to create smart standard normative tables in articles or books',\n  },\n  [BitType.smartStandardTableNonNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardTableNonNormative,\n    description:\n      'Smart standard non-normative table bit, used to create smart standard non-normative tables in articles or books',\n  },\n  [BitType.smartStandardRemarkTableNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardRemarkTableNormative,\n    description:\n      'Smart standard normative remark table bit, used to create smart standard normative remark tables in articles or books',\n  },\n  [BitType.smartStandardRemarkTableNonNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardRemarkTableNonNormative,\n    description:\n      'Smart standard non-normative remark table bit, used to create smart standard non-normative remark tables in articles or books',\n  },\n  [BitType.smartStandardTableExtendedNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardTableExtendedNormative,\n    description:\n      'Smart standard normative extended table bit, used to create smart standard normative extended tables in articles or books',\n    // PLAN-141 F2 (NISO import): a table-wrap is STRUCTURAL-shaped (no\n    // @children — no body): <label> → [%], <caption><title> → the bit-level\n    // [@caption] (D5), the inner <table>/<table-wrap-foot> build the\n    // table-extended card grid via the card set's authored keys, and a\n    // footer <def-list> PROMOTES as a sibling legend bit. Anchor = the\n    // source id (D2 revised).\n    mappingKeys: {\n      'xml-niso-iec': { '@el': 'table-wrap', '@attr': { id: '$customerId' }, '▼': '$anchor' },\n    },\n  },\n  [BitType.smartStandardTableExtendedNonNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardTableExtendedNonNormative,\n    description:\n      'Smart standard non-normative extended table bit, used to create smart standard non-normative extended tables in articles or books',\n  },\n  [BitType.smartStandardRemarkTableExtendedNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardRemarkTableExtendedNormative,\n    description:\n      'Smart standard normative remark extended table bit, used to create smart standard normative remark extended tables in articles or books',\n  },\n  [BitType.smartStandardRemarkTableExtendedNonNormative]: {\n    since: '1.28.0',\n    baseBitType: BitType.standardRemarkTableExtendedNonNormative,\n    description:\n      'Smart standard non-normative remark extended table bit, used to create smart standard non-normative remark extended tables in articles or books',\n  },\n  [BitType.smartStandardTableNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardTableNormative,\n    description:\n      'Collapsible smart standard normative table bit, used to create collapsible smart standard normative tables in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.smartStandardTableNonNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardTableNonNormative,\n    description:\n      'Collapsible smart standard non-normative table bit, used to create collapsible smart standard non-normative tables in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.smartStandardRemarkTableNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardRemarkTableNormative,\n    description:\n      'Collapsible smart standard normative remark table bit, used to create collapsible smart standard normative remark tables in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.smartStandardRemarkTableNonNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardRemarkTableNonNormative,\n    description:\n      'Collapsible smart standard non-normative remark table bit, used to create collapsible smart standard non-normative remark tables in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.smartStandardTableExtendedNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardTableExtendedNormative,\n    description:\n      'Collapsible smart standard normative extended table bit, used to create collapsible smart standard normative extended tables in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.smartStandardTableExtendedNonNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardTableExtendedNonNormative,\n    description:\n      'Collapsible smart standard non-normative extended table bit, used to create collapsible smart standard non-normative extended tables in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.smartStandardRemarkTableExtendedNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardRemarkTableExtendedNormative,\n    description:\n      'Collapsible smart standard normative remark extended table bit, used to create collapsible smart standard normative remark extended tables in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.smartStandardRemarkTableExtendedNonNormativeCollapsible]: {\n    since: '1.28.0',\n    deprecated: '5.37.0',\n    baseBitType: BitType.smartStandardRemarkTableExtendedNonNormative,\n    description:\n      'Collapsible smart standard non-normative remark extended table bit, used to create collapsible smart standard non-normative remark extended tables in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_isCollapsible,\n        description: 'If true, the bit is collapsible (defaults true for this deprecated bit type)',\n        format: TagFormat.boolean,\n        defaultValue: 'true',\n      },\n    ],\n  },\n  [BitType.parameters]: {\n    since: '1.18.0',\n    baseBitType: BitType.table,\n    description: 'Parameters bit, used to create parameter tables in articles or books',\n  },\n  [BitType.toc]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Table of contents bit, used to create a table of contents in articles or books',\n  },\n  [BitType.tocChapter]: {\n    since: '1.5.5',\n    baseBitType: BitType.toc,\n    description: 'Table of contents chapter bit, used to create chapters in the table of contents',\n    tags: [\n      {\n        key: ConfigKey.property_maxDisplayLevel,\n        description: 'Maximum display level for the chapter in the table of contents',\n        format: TagFormat.number,\n        nullable: true,\n      },\n    ],\n  },\n  [BitType.tocInline]: {\n    since: '3.24.0',\n    baseBitType: BitType.toc,\n    description:\n      'Inline table of contents bit, used to create inline tables of contents in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_maxTocChapterLevel,\n        description: 'Maximum chapter level for the inline table of contents',\n        format: TagFormat.number,\n        nullable: true,\n      },\n    ],\n  },\n  [BitType.tocResource]: {\n    since: '3.31.0',\n    baseBitType: BitType.toc,\n    description:\n      'Table of contents resource bit, used to create resources in the table of contents',\n    tags: [\n      {\n        key: ConfigKey.property_tocResource,\n        description: 'Resource content for the table of contents, used to define the resource',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description:\n          'Caption for the button in the table of contents resource, used to define the text displayed on the button',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.tocContent]: {\n    since: '3.31.0',\n    baseBitType: BitType.toc,\n    description:\n      'Table of contents content bit, used to create content sections in the table of contents',\n    tags: [\n      {\n        key: ConfigKey.property_tocContent,\n        description: 'Content for the table of contents, used to define the content section',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description:\n          'Caption for the button in the table of contents content, used to define the text displayed on the button',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.anchor]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Anchor bit, used to create anchors in articles or books',\n  },\n  [BitType.bitBookEnding]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Bit book ending bit, used to create endings in articles or books',\n  },\n  [BitType.bitBookSummary]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Bit book summary bit, used to create summaries in articles or books',\n  },\n  [BitType.botActionAnnounce]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Bot action announce bit, used to create announcements in articles or books',\n  },\n  [BitType.botActionRatingNumber]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Bot action rating number bit, used to create rating number actions in articles or books',\n  },\n  [BitType.botActionRemind]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Bot action remind bit, used to create reminders in articles or books',\n  },\n  [BitType.botActionSave]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Bot action save bit, used to create save actions in articles or books',\n  },\n  [BitType.botActionTrueFalse]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Bot action true/false bit, used to create true/false actions in articles or books',\n  },\n  [BitType.chapterSubjectMatter]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Chapter subject matter bit, used to create subject matter chapters in articles or books',\n  },\n  [BitType.chat]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Chat bit, used to create chat sections in articles or books',\n  },\n  [BitType.conclusion]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Conclusion bit, used to create conclusions in articles or books',\n  },\n  [BitType.conclusionAlt]: {\n    since: '1.16.0',\n    baseBitType: BitType.conclusion,\n    description:\n      'Alternative conclusion bit, used to create alternative conclusions in articles or books',\n  },\n  [BitType.documentUpload]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description:\n      'Document upload bit, used to create document upload sections in articles or books',\n  },\n  [BitType.footNote]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Footnote bit, used to create footnotes in articles or books',\n  },\n  [BitType.formFreeText]: {\n    since: '5.3.0',\n    baseBitType: BitType.interview,\n    description: 'Form free text bit, used to create free text forms in articles or books',\n  },\n  [BitType.groupBorn]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Group born bit, used to create group born sections in articles or books',\n  },\n  [BitType.groupDied]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Group died bit, used to create group died sections in articles or books',\n  },\n  [BitType.recordAudio]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Record audio bit, used to create audio recording sections in articles or books',\n  },\n  [BitType.recordVideo]: {\n    since: '1.5.24',\n    baseBitType: BitType._standard,\n    description: 'Record video bit, used to create video recording sections in articles or books',\n  },\n  [BitType.stickyNote]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Sticky note bit, used to create sticky notes in articles or books',\n  },\n  [BitType.takePicture]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Take picture bit, used to create picture taking sections in articles or books',\n  },\n  [BitType.handInAudio]: {\n    since: '1.5.15',\n    baseBitType: BitType._standard,\n    description: 'Hand in audio bit, used to create audio submission sections in articles or books',\n  },\n  [BitType.handInContact]: {\n    since: '1.5.15',\n    baseBitType: BitType._standard,\n    description:\n      'Hand in contact bit, used to create contact submission sections in articles or books',\n  },\n  [BitType.handInDocument]: {\n    since: '1.5.15',\n    baseBitType: BitType._standard,\n    description:\n      'Hand in document bit, used to create document submission sections in articles or books',\n  },\n  [BitType.handInFile]: {\n    //\n    since: '3.2.0',\n    baseBitType: BitType._standard,\n    description: 'Hand in file bit, used to create file submission sections in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_handInAcceptFileType,\n        description:\n          'Accepted file types for the hand-in file, used to define allowed file formats',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n    ],\n  },\n  [BitType.handInFreeText]: {\n    since: '5.3.0',\n    baseBitType: BitType.interview,\n    description:\n      'Hand in free text bit, used to create free text submission sections in articles or books',\n  },\n  [BitType.handInFreeTextExpert]: {\n    since: '5.3.0',\n    baseBitType: BitType.interview,\n    description:\n      'Hand in free text expert bit, used to create free text expert submission sections in articles or books',\n  },\n  [BitType.handInLocation]: {\n    since: '1.5.15',\n    baseBitType: BitType._standard,\n    description:\n      'Hand in location bit, used to create location submission sections in articles or books',\n  },\n  [BitType.handInPhoto]: {\n    since: '1.5.15',\n    baseBitType: BitType._standard,\n    description: 'Hand in photo bit, used to create photo submission sections in articles or books',\n  },\n  [BitType.handInScan]: {\n    since: '1.5.15',\n    baseBitType: BitType._standard,\n    description: 'Hand in scan bit, used to create scan submission sections in articles or books',\n  },\n  [BitType.handInSystemMedia]: {\n    //\n    since: '1.5.15',\n    baseBitType: BitType._standard,\n    description:\n      'Hand in system media bit, used to create system media submission sections in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_handInAcceptFileType,\n        description:\n          'Accepted file types for the hand-in system media, used to define allowed file formats',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n    ],\n  },\n  [BitType.handInSubmit]: {\n    //\n    since: '3.2.0',\n    baseBitType: BitType._standard,\n    description: 'Hand in submit bit, used to create submission sections in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_handInRequirement,\n        description: 'Requirement for the hand-in submission, used to define what is needed',\n        format: TagFormat.plainText,\n        maxCount: Count.infinity,\n      },\n      {\n        key: ConfigKey.property_handInInstruction,\n        description: 'Instruction for the hand-in submission, used to guide the user',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_buttonCaption,\n        description:\n          'Caption for the button in the hand-in submission, used to define the button text',\n        format: TagFormat.plainText,\n      },\n    ],\n  },\n  [BitType.handInVideo]: {\n    since: '1.5.15',\n    baseBitType: BitType._standard,\n    description: 'Hand in video bit, used to create video submission sections in articles or books',\n  },\n  [BitType.handInVoice]: {\n    since: '1.5.15',\n    baseBitType: BitType._standard,\n    description: 'Hand in voice bit, used to create voice submission sections in articles or books',\n  },\n  [BitType.trueFalse1]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'True/False bit, used to create true/false questions in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for true/false questions',\n      },\n      {\n        key: ConfigKey.property_labelTrue,\n        description: 'Label for the true option in the true/false question',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_labelFalse,\n        description: 'Label for the false option in the true/false question',\n        format: TagFormat.plainText,\n      },\n      {\n        // PLAN-067 Edit #1: true-false-1's `+` / `-` emit a flat\n        // `{ statement, isCorrect }` at bit root (single-statement bit),\n        // not a `choices[]` array. Format is bitmarkText so the statement\n        // body renders as a ProseMirror tree, matching reference fixtures.\n        exportJsonKey: { statement: '$', isCorrect: true },\n        key: ConfigKey.tag_true,\n        description: 'Tag for the true option in the true/false question',\n        format: TagFormat.bitmarkText,\n      },\n      {\n        exportJsonKey: { statement: '$', isCorrect: false },\n        key: ConfigKey.tag_false,\n        description: 'Tag for the false option in the true/false question',\n        format: TagFormat.bitmarkText,\n      },\n      {\n        // Override inherited @example from group_standardTags: boolean root\n        // example. Note: the legacy reference parser ties the bare-form\n        // example value to `statement.isCorrect`, but the statement is not\n        // yet emitted when this tag fires at bit-header. The pattern below\n        // emits a literal `true` for bare/synthesized and `$` for valued —\n        // sufficient for `[+...]` (correct) statements which dominate the\n        // fixtures; `[-...]` (incorrect) bits with bare `[@example]` would\n        // need either a runtime extension or an explicit `[@example:false]`.\n        //\n        // Format is `boolean` so `[@example:false]` coerces to JSON `false`\n        // (a natural default that gets stripped in optimised mode, matching\n        // BPG's `rootExampleType: boolean`). PlainText would emit the\n        // STRING `\"false\"` which doesn't strip.\n        key: ConfigKey.property_example,\n        exportJsonKey: [\n          { '@keyonly': { isExample: true, example: true } },\n          { '@absent': { isExample: true, example: true } },\n          // `[@example:false]`: emit `isExample: true` only — `example: false`\n          // is the natural default for boolean, stripped in optimised mode.\n          // Mirrors BPG `removeUnwantedProperties` `ignoreAllFalse: true`.\n          { '@value=false': { isExample: true } },\n          { isExample: true, example: '$' },\n        ],\n        description: 'The example flag for the bit (boolean)',\n        format: TagFormat.boolean,\n        nullable: true,\n      },\n    ],\n    rootExampleType: ExampleType.boolean,\n  },\n\n  [BitType.trueFalse]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'True/False bit, used to create true/false questions in articles or books',\n    quizBit: true,\n    tags: [\n      {\n        key: ConfigKey.group_quizCommon,\n        description: 'Common quiz tags for true/false questions',\n      },\n      {\n        key: ConfigKey.property_labelTrue,\n        description: 'Label for the true option in the true/false question',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_labelFalse,\n        description: 'Label for the false option in the true/false question',\n        format: TagFormat.plainText,\n      },\n      {\n        // Override inherited @example: in `isTopLevelExample` allow-list.\n        key: ConfigKey.property_example,\n        exportJsonKey: [\n          { '@keyonly': { isExample: true } },\n          { '@absent': { isExample: true } },\n          { isExample: true, example: '$' },\n        ],\n        description: 'The example(s) for the bit',\n        format: TagFormat.bitmarkText,\n        nullable: true,\n      },\n    ],\n    cardSet: CardSetConfigKey.statements,\n  },\n  [BitType.vendorAmcharts5Chart]: {\n    since: '1.5.8',\n    baseBitType: BitType.code,\n    description: 'AmCharts 5 chart bit, used to embed AmCharts 5 charts in articles or books',\n\n    textFormatDefault: TextFormat.json,\n  },\n  [BitType.vendorDatadogDashboard]: {\n    since: '5.2.0',\n    baseBitType: BitType.nonProductionPrototypeIframe,\n    description: 'A Datadog dashboard bit, used to embed Datadog dashboards',\n  },\n  [BitType.vendorDatadogDashboardEmbed]: {\n    since: '3.12.0',\n    baseBitType: BitType.code,\n    description:\n      'Datadog dashboard embed bit, used to embed Datadog dashboards in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_vendorDashboardId,\n        description:\n          'Dashboard ID for the Datadog dashboard, used to define which dashboard to embed',\n        format: TagFormat.plainText,\n      },\n    ],\n    textFormatDefault: TextFormat.plainText,\n  },\n  [BitType.vendorFormbricksEmbed]: {\n    since: '3.8.0',\n    baseBitType: BitType.code,\n    description: 'Formbricks embed bit, used to embed Formbricks surveys in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_vendorSurveyId,\n        description: 'Survey ID for the Formbricks survey, used to define which survey to embed',\n        format: TagFormat.plainText,\n      },\n    ],\n    textFormatDefault: TextFormat.plainText,\n  },\n  [BitType.vendorFormbricksEmbedAnonymous]: {\n    since: '3.9.0',\n    baseBitType: BitType.vendorFormbricksEmbed,\n    description:\n      'Anonymous Formbricks embed bit, used to embed anonymous Formbricks surveys in articles or books',\n  },\n  [BitType.vendorFormbricksLink]: {\n    since: '3.8.0',\n    baseBitType: BitType.code,\n    description:\n      'Formbricks link bit, used to create links to Formbricks surveys in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_vendorSurveyId,\n        description: 'Survey ID for the Formbricks survey, used to define which survey to link to',\n        format: TagFormat.plainText,\n      },\n    ],\n    textFormatDefault: TextFormat.plainText,\n  },\n  [BitType.vendorFormbricksLinkAnonymous]: {\n    since: '3.9.0',\n    baseBitType: BitType.vendorFormbricksLink,\n    description:\n      'Anonymous Formbricks link bit, used to create links to anonymous Formbricks surveys in articles or books',\n  },\n  [BitType.vendorHighchartsChart]: {\n    since: '1.5.28',\n    baseBitType: BitType.vendorAmcharts5Chart,\n    description: 'Highcharts chart bit, used to embed Highcharts charts in articles or books',\n  },\n  [BitType.vendorIframelyEmbed]: {\n    since: '1.5.10',\n    baseBitType: BitType.code,\n    description:\n      'Iframely embed bit, used to embed content from various sources in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_width, // Same as image\n        description: 'Width for the embedded content, used to define the width in pixels',\n        format: TagFormat.number,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_height, // Same as image\n        description: 'Height for the embedded content, used to define the height in pixels',\n        format: TagFormat.number,\n        nullable: true,\n      },\n      {\n        key: ConfigKey.property_vendorUrl,\n        description: 'URL for the content to be embedded, used to define the source URL',\n        format: TagFormat.plainText,\n      },\n    ],\n    textFormatDefault: TextFormat.plainText,\n  },\n  [BitType.vendorIframelyCard]: {\n    since: '1.5.10',\n    baseBitType: BitType.vendorIframelyEmbed,\n    description:\n      'Iframely card bit, used to create cards for embedded content in articles or books',\n  },\n  [BitType.vendorIframelyPreview]: {\n    since: '1.5.10',\n    baseBitType: BitType.vendorIframelyEmbed,\n    description:\n      'Iframely preview bit, used to create previews for embedded content in articles or books',\n  },\n  [BitType.vendorIframelyPreviewMini]: {\n    since: '1.5.10',\n    baseBitType: BitType.vendorIframelyEmbed,\n    description:\n      'Iframely preview mini bit, used to create mini previews for embedded content in articles or books',\n  },\n  [BitType.vendorJupyterOutput]: {\n    since: '1.4.3',\n    baseBitType: BitType.code,\n    description: 'Jupyter output bit, used to embed Jupyter notebook outputs in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_jupyterId,\n        description: 'Jupyter ID for the notebook, used to define which notebook to embed',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_jupyterExecutionCount,\n        description: 'Execution count for the Jupyter output, used to define the execution order',\n        format: TagFormat.number,\n        nullable: true,\n      },\n    ],\n    textFormatDefault: TextFormat.plainText,\n  },\n  [BitType.vendorJupyterCellCode]: {\n    since: '1.4.3',\n    baseBitType: BitType.vendorJupyterOutput,\n    description:\n      'Jupyter cell code bit, used to embed Jupyter notebook cell code in articles or books',\n  },\n  [BitType.vendorJupyterCellMarkdown]: {\n    since: '1.4.3',\n    baseBitType: BitType.vendorJupyterOutput,\n    description:\n      'Jupyter cell markdown bit, used to embed Jupyter notebook cell markdown in articles or books',\n  },\n  [BitType.vendorJupyterCellRaw]: {\n    since: '1.4.3',\n    baseBitType: BitType.vendorJupyterOutput,\n    description:\n      'Jupyter cell raw bit, used to embed Jupyter notebook cell raw content in articles or books',\n  },\n  [BitType.vendorJupyterIpynb]: {\n    since: '1.4.3',\n    baseBitType: BitType.vendorJupyterOutput,\n    description: 'Jupyter IPYNB bit, used to embed Jupyter notebook files in articles or books',\n  },\n  [BitType.vendorPadletEmbed]: {\n    since: '1.3.0',\n    baseBitType: BitType.code,\n    description: 'Padlet embed bit, used to embed Padlet boards in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_padletId,\n        description: 'Padlet ID for the board, used to define which Padlet to embed',\n        format: TagFormat.plainText,\n      },\n    ],\n    textFormatDefault: TextFormat.plainText,\n  },\n  [BitType.vendorStripePricingTable]: {\n    since: '1.20.0',\n    baseBitType: BitType.article,\n    description:\n      'Stripe pricing table bit, used to embed Stripe pricing tables in articles or books',\n    tags: [\n      {\n        key: ConfigKey.property_stripePricingTableId,\n        description: 'Stripe pricing table ID, used to define which pricing table to embed',\n        format: TagFormat.plainText,\n        minCount: 1,\n      },\n      {\n        key: ConfigKey.property_stripePublishableKey,\n        description: 'Stripe publishable key, used to authenticate the Stripe pricing table',\n        format: TagFormat.plainText,\n        minCount: 1,\n      },\n    ],\n  },\n  [BitType.vendorStripePricingTableExternal]: {\n    since: '3.13.0',\n    baseBitType: BitType.vendorStripePricingTable,\n    description:\n      'External Stripe pricing table bit, used to embed external Stripe pricing tables in articles or books',\n  },\n  [BitType.vendorStripePricingTablePrintOnRequest]: {\n    since: '5.21.0',\n    baseBitType: BitType.vendorStripePricingTable,\n    description:\n      'Stripe pricing table bit with print-on-request customer/product IDs, used to embed Stripe pricing tables tied to a specific print-on-request customer and product',\n    tags: [\n      {\n        key: ConfigKey.property_stripePricingTableDescriptiveName,\n        description: 'Descriptive name for the Stripe pricing table',\n        format: TagFormat.plainText,\n      },\n      {\n        key: ConfigKey.property_printOnRequestCustomerId,\n        description:\n          'Print-on-request customer ID, used to identify the customer for the print-on-request flow',\n        format: TagFormat.plainText,\n        minCount: 1,\n      },\n      {\n        key: ConfigKey.property_printOnRequestProductId,\n        description:\n          'Print-on-request product ID, used to identify the product for the print-on-request flow',\n        format: TagFormat.plainText,\n        minCount: 1,\n      },\n    ],\n  },\n\n  [BitType.video]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Video bit, used to embed videos in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Resource bit tags for videos, used to define additional properties',\n      },\n      {\n        key: ConfigKey.group_resourceVideo,\n        description: 'Resource video tags, used to attach videos to the bit',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.videoLandscape]: {\n    since: '1.3.0',\n    baseBitType: BitType.video,\n    description: 'Landscape video bit, used to embed landscape videos in articles or books',\n  },\n  [BitType.videoPortrait]: {\n    since: '1.3.0',\n    baseBitType: BitType.video,\n    description: 'Portrait video bit, used to embed portrait videos in articles or books',\n  },\n  [BitType.videoEmbed]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Video embed bit, used to embed videos from external sources in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Resource bit tags for video embeds, used to define additional properties',\n      },\n      {\n        key: ConfigKey.group_resourceVideoEmbed,\n        description: 'Resource video embed tags, used to attach video embeds to the bit',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.videoEmbedLandscape]: {\n    since: '1.3.0',\n    baseBitType: BitType.videoEmbed,\n    description:\n      'Landscape video embed bit, used to embed landscape videos from external sources in articles or books',\n  },\n  [BitType.videoEmbedPortrait]: {\n    since: '1.3.0',\n    baseBitType: BitType.videoEmbed,\n    description:\n      'Portrait video embed bit, used to embed portrait videos from external sources in articles or books',\n  },\n  [BitType.videoLink]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Video link bit, used to create links to videos in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Resource bit tags for video links, used to define additional properties',\n      },\n      {\n        key: ConfigKey.group_resourceVideoLink,\n        description: 'Resource video link tags, used to attach video links to the bit',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.videoLinkLandscape]: {\n    since: '1.3.0',\n    baseBitType: BitType.videoLink,\n    description:\n      'Landscape video link bit, used to create links to landscape videos in articles or books',\n  },\n  [BitType.videoLinkPortrait]: {\n    since: '1.3.0',\n    baseBitType: BitType.videoLink,\n    description:\n      'Portrait video link bit, used to create links to portrait videos in articles or books',\n  },\n  [BitType.websiteLink]: {\n    since: '1.3.0',\n    baseBitType: BitType._standard,\n    description: 'Website link bit, used to create links to websites in articles or books',\n    tags: [\n      {\n        key: ConfigKey.group_resourceBitTags,\n        description: 'Resource bit tags for website links, used to define additional properties',\n      },\n      {\n        key: ConfigKey.group_resourceWebsiteLink,\n        description: 'Resource website link tags, used to attach website links to the bit',\n        minCount: 1,\n      },\n    ],\n    resourceAttachmentAllowed: false,\n  },\n  [BitType.nonProductionPrototypeIframe]: {\n    since: '4.20.0',\n    baseBitType: BitType._standard,\n    description: 'A non-production prototype iframe bit, used to embed prototype iframes',\n    tags: [\n      {\n        key: ConfigKey.property_iframeSrc,\n        description: 'Iframe source URL, used to define the source of the iframe',\n        minCount: 1,\n      },\n      {\n        key: ConfigKey.property_iframeName,\n        description: 'Iframe name, used to define the name of the iframe',\n      },\n    ],\n  },\n  [BitType.vendorLearndashEmbed]: {\n    since: '5.0.0',\n    baseBitType: BitType.nonProductionPrototypeIframe,\n    description: 'Learndash embed bit, used to embed Learndash content in an iframe',\n  },\n};\n\nexport { BITS };\n","// This file is automatically generated. DO NOT EDIT.\n\n/* eslint-disable */\n\nexport const PACKAGE_INFO = {\n  \"name\": \"@gmb/bitmark-parser-generator\",\n  \"version\": \"5.37.0\",\n  \"author\": \"Get More Brain Ltd\",\n  \"license\": \"ISC\",\n  \"description\": \"A bitmark parser and generator using Peggy.js\"\n};\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst Environment = {\n  unknown: '',\n  node: 'node',\n  chrome: 'chrome',\n  safari: 'safari',\n  firefox: 'firefox',\n  edge: 'edge',\n  ie: 'ie',\n} as const;\n\nexport type EnvironmentType = EnumType<typeof Environment>;\n\nexport { Environment };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst Os = {\n  unknown: '',\n  macos: 'macos',\n  windows: 'windows',\n  linux: 'linux',\n  android: 'android',\n  ios: 'ios',\n} as const;\n\nexport type OsType = EnumType<typeof Os>;\n\nexport { Os };\n","import { Environment, type EnvironmentType } from './Environment.ts';\nimport { Os, type OsType } from './Os.ts';\n\nexport interface UserAgentInfo {\n  browser: EnvironmentType;\n  browserVersion?: string;\n  os: OsType;\n  osVersion?: string;\n}\n\ninterface TokenizedUserAgent {\n  keys: Set<string>;\n  versions: {\n    [key: string]: string;\n  };\n}\n\nfunction parseUserAgent(): UserAgentInfo | undefined {\n  if (typeof window === 'undefined' || !window.navigator || !window.navigator.userAgent)\n    return undefined;\n\n  const uai: UserAgentInfo = {\n    browser: Environment.unknown,\n    os: Os.unknown,\n  };\n\n  const userAgent = window.navigator.userAgent;\n  const tua = tokenizeUserAgent(userAgent);\n\n  // const containsIphoneIpadIpod = tua.keys.has('iphone') || tua.keys.has('ipad') || tua.keys.has('ipod');\n  // const containsMobi = tua.keys.has('mobi');\n  const containsFirefox = tua.keys.has('firefox');\n  // const containsSeamonkey = tua.keys.has('seamonkey');\n  const containsChrome = tua.keys.has('chrome');\n  const containsChromium = tua.keys.has('chromium');\n  const containsSafari = tua.keys.has('safari');\n  // const containsOperaOPR = tua.keys.has('opera') || tua.keys.has('opr');\n  // const containsTridentMSIE = tua.keys.has('trident') || tua.keys.has('msie');\n  const containsMacintosh = tua.keys.has('macintosh');\n\n  const isSafari = containsSafari && !containsChrome && !containsChromium;\n  const isChrome = containsChrome;\n  // const isChromium = containsChromium && !containsChrome;\n  const isFirefox = containsFirefox;\n  // const isSeamonkey = containsSeamonkey && !containsFirefox;\n  // const isOpera = containsOperaOPR;\n  // const isIE = containsTridentMSIE;\n  // const isMobileOrTablet = containsMobi;\n  // const isIOS = containsIphoneIpadIpod;\n  const isMacOS = containsMacintosh;\n\n  // Browser\n  if (isSafari) {\n    uai.browser = Environment.safari;\n    uai.browserVersion = tua.versions.version;\n  } else if (isChrome) {\n    uai.browser = Environment.chrome;\n    uai.browserVersion = tua.versions.chrome;\n  } else if (isFirefox) {\n    uai.browser = Environment.firefox;\n    uai.browserVersion = tua.versions.firefox;\n  }\n\n  // OS\n  if (isMacOS) {\n    uai.os = Os.macos;\n    uai.osVersion = tua.versions.x;\n  }\n\n  return uai;\n}\n\nfunction tokenizeUserAgent(userAgent: string): TokenizedUserAgent {\n  const rawKeys = userAgent\n    .toLowerCase()\n    .split(new RegExp('[ /,;()]', 'g'))\n    .reduce((acc, val) => {\n      if (val) acc.push(val);\n      return acc;\n    }, [] as string[]);\n\n  const tua: TokenizedUserAgent = {\n    keys: new Set(),\n    versions: {},\n  };\n\n  let prevRawKey = '';\n  for (let i = 0, len = rawKeys.length; i < len; i++) {\n    const rawKey = rawKeys[i];\n\n    let isNumber = false;\n    for (let i = 0; i <= 9; i++) {\n      if (rawKey.startsWith(`${i}`)) {\n        isNumber = true;\n        break;\n      }\n    }\n    if (isNumber) {\n      tua.versions[prevRawKey] = rawKey.replace('_', '.');\n    } else {\n      tua.keys.add(rawKey);\n    }\n    prevRawKey = rawKey;\n  }\n\n  return tua;\n}\n\nexport { parseUserAgent };\n","export interface Version {\n  full: string;\n  major: string;\n  minor: string;\n  patch: string;\n  build: string;\n}\n\nconst EMPTY_VERSION: Version = {\n  full: '',\n  major: '',\n  minor: '',\n  patch: '',\n  build: '',\n};\n\nexport { EMPTY_VERSION };\n","import { Environment, type EnvironmentType } from './Environment.ts';\nimport { Os, type OsType } from './Os.ts';\nimport { parseUserAgent, type UserAgentInfo } from './userAgent.ts';\nimport { EMPTY_VERSION, type Version } from './Version.ts';\n\ndeclare const process: {\n  env: { [key: string]: string };\n  version?: string;\n  versions?: { [key: string]: string };\n};\n\nclass Env {\n  public bootTimestamp: number;\n  public app: string;\n  public appVersion: Version;\n  public environment: EnvironmentType;\n  public environmentVersion: Version;\n  public os: OsType;\n  public osVersion: Version;\n  public isBrowser: boolean;\n  public isNode: boolean;\n  public isCI: boolean;\n  public NODE_ENV: string;\n\n  // public username: string;\n  // public usergroup: string;\n  // public uid: number;\n  // public gid: number;\n  // public homedir: string;\n  // public shell: string;\n\n  private userAgentInfo: UserAgentInfo | undefined;\n\n  constructor() {\n    Object.defineProperty(this, 'userAgentInfo', {\n      value: parseUserAgent(),\n      enumerable: false,\n    });\n    this.bootTimestamp = Date.now();\n    this.app = '';\n    this.appVersion = EMPTY_VERSION;\n    this.environment = this.getEnvironment();\n    this.environmentVersion = this.getEnvironmentVersion();\n    this.isBrowser = this.getIsBrowser();\n    this.isNode = this.environment === Environment.node;\n    this.isCI = this.getIsCI();\n    this.NODE_ENV = this.getNodeEnv();\n    this.os = this.getOs();\n    this.osVersion = this.getOsVersion();\n  }\n\n  public init(app: string, version: string): void {\n    this.app = app;\n    this.appVersion = this.parseMMBVersion(version);\n  }\n\n  get upTimestamp(): number {\n    return Date.now() - this.bootTimestamp;\n  }\n\n  private getEnvironment(): EnvironmentType {\n    if (this.userAgentInfo) {\n      return this.userAgentInfo.browser;\n    } else if (typeof process !== 'undefined') {\n      if (process.versions !== undefined) {\n        if (process.versions.node) return Environment.node;\n      }\n    }\n\n    return Environment.unknown;\n  }\n\n  private getEnvironmentVersion(): Version {\n    if (this.userAgentInfo) {\n      return this.parseMMBVersion(this.userAgentInfo.browserVersion);\n    } else if (typeof process !== 'undefined') {\n      return this.parseMMBVersion(process.version);\n    }\n    return EMPTY_VERSION;\n  }\n\n  private getOs(): OsType {\n    if (this.userAgentInfo) {\n      return this.userAgentInfo.os;\n    } else if (typeof process !== 'undefined') {\n      if (process.versions !== undefined) {\n        if (process.versions.node) return Os.unknown;\n      }\n    }\n\n    return Os.unknown;\n  }\n\n  private getOsVersion(): Version {\n    if (this.userAgentInfo) {\n      return this.parseMMBVersion(this.userAgentInfo.osVersion);\n    } else if (typeof process !== 'undefined') {\n      return this.parseMMBVersion('');\n    }\n    return EMPTY_VERSION;\n  }\n\n  private getIsBrowser(): boolean {\n    return !!(\n      typeof window !== 'undefined' &&\n      typeof document !== 'undefined' &&\n      typeof navigator !== 'undefined' &&\n      navigator.userAgent\n    );\n  }\n\n  private getIsCI(): boolean {\n    return !!(typeof process !== 'undefined' && process.env && process.env.CI);\n  }\n\n  private getNodeEnv(): string {\n    return (typeof process !== 'undefined' && process.env && process.env.NODE_ENV) || '';\n  }\n\n  /**\n   * TODO:\n   * Parse Senver 2.0 ?? https://semver.org/\n   * and X.Y.Z.B using regex\n   *\n   * @param version\n   */\n  private parseMMBVersion(version?: string): Version {\n    if (!version) return EMPTY_VERSION;\n\n    // Remove leading v\n    if (version.startsWith('v')) {\n      version = version.substring(1);\n    }\n\n    // Parse major/minor/build\n    const s = version.split('.', 1000);\n    let major = '';\n    let minor = '';\n    let build = '';\n    let patch = '';\n    for (let i = 0, len = s.length; i < len; i++) {\n      const v = s[i];\n      if (i === 0) major = v;\n      else if (i === 1) minor = v;\n      else if (i === 2) patch = v;\n      else if (i === 3) build = v;\n    }\n\n    return {\n      full: version,\n      major,\n      minor,\n      patch,\n      build,\n    };\n  }\n}\n\nconst env = new Env();\nconst initEnv = env.init.bind(env);\n\nexport { env, initEnv };\n","import '../config/Config.ts';\n\nimport { PACKAGE_INFO } from '../generated/package_info.ts';\nimport { initEnv } from '../utils/env/Env.ts';\n\nlet initialised = false;\n\n// Initialise the application\nfunction init(): void {\n  if (initialised) return;\n\n  initEnv(PACKAGE_INFO.name, PACKAGE_INFO.version);\n\n  initialised = true;\n}\n\nexport { init };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { init } from '../init/init.ts';\nimport { type BitmarkAst, type Node } from '../model/ast/Nodes.ts';\nimport { NodeType, type NodeTypeType } from '../model/ast/NodeType.ts';\nimport { StringUtils } from '../utils/StringUtils.ts';\n\n/**\n * AST tree node information\n */\nexport interface NodeInfo {\n  /**\n   * Child index of the node\n   */\n  index: number;\n  /**\n   * Node key\n   */\n  key: NodeTypeType;\n  /**\n   * Node value (if any)\n   */\n  value?: any; // eslint-disable-line @typescript-eslint/no-explicit-any\n}\n\n/**\n * Callbacks for walking the AST\n */\nexport interface AstWalkCallbacks<C = undefined> {\n  /**\n   * Called when a branch node is entered\n   *\n   * @param node - this node info\n   * @param route - route to this node from the root\n   * @returns\n   */\n  enter?: (node: NodeInfo, route: NodeInfo[], context: C) => void | boolean;\n\n  /**\n   * Called when between child nodes\n   *\n   * @param node - this node info (the parent of the children in leftNode / rightNode)\n   * @param leftNode - the left (previous) child node info\n   * @param rightNode - the right (next) child node info\n   * @param route\n   * @returns\n   */\n  between?: (\n    node: NodeInfo,\n    leftNode: NodeInfo,\n    rightNode: NodeInfo,\n    route: NodeInfo[],\n    context: C,\n  ) => void | boolean;\n\n  /**\n   * Called when a branch node is exited\n   * @param node - this node info\n   * @param route - route to this node from the root\n   * @returns\n   */\n  exit?: (node: NodeInfo, route: NodeInfo[], context: C) => void;\n\n  /**\n   * Called when a leaf node is entered\n   * @param node - this node info\n   * @param route - route to this node from the root\n   * @returns\n   */\n  leaf?: (node: NodeInfo, route: NodeInfo[], context: C) => void;\n}\n\n/**\n * An AST (Abstract Syntax Tree) implementation for the bitmark language\n */\nclass Ast {\n  constructor() {\n    // Ensure init has been called - this is not the best place, but there is no standard entry point\n    init();\n  }\n\n  /**\n   * Walk bitmark AST, decending each branch and calling callbacks when entering, leaving, and when in between child\n   * nodes.\n   *\n   * Walking the tree can be used to convert it to another format (e.g. bitmark markup or JSON or text) or for analysis.\n   *\n   * The tree is navigated from root to leaf, decending each branch greedily.\n   *\n   * e.g. for the tree:\n   * ```\n   * A\n   * |__B1\n   * |  |__C1\n   * |  |__C2\n   * |__B2\n   *    |__C3\n   *\n   * Enter A1\n   * Enter B1\n   * Leaf  C1\n   * Betwe B1 (C1, C2)\n   * Leaf  C2\n   * Exit  B1\n   * Betwe A1 (B1, B2)\n   * Enter B2\n   * Leaf  C3\n   * Exit  B2\n   * Exit  A1\n   * ```\n   *\n   * @param context - context object to pass to callbacks\n   * @param ast - bitmark / text AST\n   * @param type - type of AST to walk (i.e. NodeType.bitmarkAst, NodeType.textAst)\n   * @param callbacks - set of callbacks to call while walking the tree\n   */\n  walk<C>(ast: Node, type: NodeTypeType, callbacks: AstWalkCallbacks<C>, context: C): void {\n    this.walkRecursive(ast, [{ index: 0, key: type, value: ast }], callbacks, context);\n  }\n\n  /**\n   * Convert a route to a unique key that describes that route.\n   *\n   * For the route A1 -> B4 -> C2 the route key would be A1_B4_C2\n   *\n   * @param route - the tree path from the root to the curent node\n   * @returns\n   */\n  getRouteKey(route: NodeInfo[]): string {\n    return route.reduce((acc, val, idx) => {\n      if (+val.key !== val.index) {\n        acc += `${val.key}`;\n        if (idx < route.length - 1) {\n          acc += '_';\n        }\n      }\n      return acc;\n    }, '');\n  }\n\n  /**\n   * Print an AST to the console.\n   * Useful for debug / development purposes\n   *\n   * @param ast - AST\n   * @param rootKey - root node key\n   */\n  printTree(ast: Node, rootKey: NodeTypeType = NodeType.bitmarkAst): void {\n    this.walkRecursive(\n      ast,\n      [{ index: 0, key: rootKey, value: ast }],\n      {\n        enter: (_node: NodeInfo, route: NodeInfo[]): boolean => {\n          console.log('Enter:   ' + this.getRouteKey(route));\n\n          // Stop traversing the tree if the last node is bodyJson\n          if (route[route.length - 1].key === NodeType.bodyJson) return false;\n\n          return true;\n        },\n        between: (_node: NodeInfo, _left: NodeInfo, _right: NodeInfo, route: NodeInfo[]) => {\n          console.log('Between: ' + this.getRouteKey(route));\n        },\n        exit: (_node: NodeInfo, route: NodeInfo[]) => {\n          console.log('Exit:    ' + this.getRouteKey(route));\n        },\n        leaf: (_node: NodeInfo, route: NodeInfo[]) => {\n          console.log('Leaf:    ' + this.getRouteKey(route));\n        },\n      },\n      undefined,\n    );\n  }\n\n  /**\n   * Preprocess bitmark AST into a standard format (BitmarkAst object) from bitmark AST either as a string\n   * or a plain JS object\n   *\n   * @param ast - bitmark AST as a string or a plain JS object\n   * @returns bitmark AST in a standard format (BitmarkAst object)\n   */\n  preprocessAst(ast: string | unknown): BitmarkAst | undefined {\n    if (StringUtils.isString(ast)) {\n      const str = ast as string;\n      try {\n        ast = JSON.parse(str);\n      } catch (_e) {\n        // Failed to parse JSON, return empty array\n        return undefined;\n      }\n    }\n\n    if (this.isAst(ast)) {\n      return ast as BitmarkAst;\n    }\n    return undefined;\n  }\n\n  /**\n   * Check if a plain JS object is valid AST\n   *\n   * @param ast - a plain JS object that might be AST\n   * @returns true if AST, otherwise false\n   */\n  isAst(ast: unknown): boolean {\n    if (Object.prototype.hasOwnProperty.call(ast, 'bits')) {\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      if (Array.isArray((ast as any).bits)) return true;\n    }\n    return false;\n  }\n\n  private walkRecursive<C>(\n    node: Node,\n    route: NodeInfo[],\n    callbacks: AstWalkCallbacks<C>,\n    context: C,\n  ): void {\n    const { enter, between, exit, leaf } = callbacks;\n\n    const parentKey = route[route.length - 1].key;\n    const isValue = this.isValue(node);\n    const isBranch = !isValue;\n    const nodeInfo = route[route.length - 1];\n\n    // Call the enter callback for the node before walking children\n    if (isBranch) {\n      if (enter) {\n        const res = enter(nodeInfo, route, context);\n        // If return is false, stop walking this node\n        if (res === false) return;\n      }\n    } else {\n      if (leaf) leaf(nodeInfo, route, context);\n    }\n\n    // Walk child nodes\n    if (isBranch) {\n      const isArray = this.isArray(node);\n      const keys = Object.keys(node);\n      for (let i = 0, len = keys.length; i < len; i++) {\n        const key = keys[i];\n        const lastChild = i === len - 1;\n\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        const nodeAsAny = node as any;\n        const child = nodeAsAny[key];\n\n        if (child != null) {\n          const childNodeInfo: NodeInfo = {\n            key: this.getAstKey(key, parentKey, isArray),\n            index: i,\n            value: child,\n          };\n\n          const r = route.slice();\n          r.push(childNodeInfo);\n          this.walkRecursive(child, r, callbacks, context);\n\n          if (!lastChild) {\n            const nextKey = keys[i + 1];\n            const nextChild = nodeAsAny[nextKey];\n            const nextChildNodeInfo: NodeInfo = {\n              key: this.getAstKey(nextKey, parentKey, isArray),\n              index: i + 1,\n              value: nextChild,\n            };\n\n            // Call the between callback when between children\n            if (between) {\n              const res = between(nodeInfo, childNodeInfo, nextChildNodeInfo, route, context);\n              // If return is false, stop looping children\n              if (res === false) break;\n            }\n          }\n        }\n      }\n    }\n\n    // Call the exit callback for the node before walking children\n    if (isBranch) {\n      if (exit) exit(nodeInfo, route, context);\n    }\n  }\n\n  private getAstKey(key: string, parentKey: string, isParentArray: boolean): NodeTypeType {\n    let astKey = key;\n\n    if (isParentArray && parentKey) {\n      astKey = `${parentKey}Value`;\n    }\n\n    // return astKey;\n    return Enum(NodeType).fromKey(astKey) || (`unknown(${astKey})` as NodeTypeType);\n    // return AstNodeType.fromKey(astKey) || AstNodeType.unknown;\n  }\n\n  private isArray(x: unknown): boolean {\n    return Array.isArray(x);\n    // return Object.prototype.toString.call(x) === '[object Array]';\n  }\n\n  private isObject(x: unknown): boolean {\n    return Object.prototype.toString.call(x) === '[object Object]';\n  }\n\n  private isValue(x: unknown): boolean {\n    return !this.isObject(x) && !this.isArray(x);\n  }\n}\n\nexport { Ast };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst BodyBitTypeRaw = {\n  text: 'text',\n  gap: 'gap',\n  mark: 'mark',\n  select: 'select',\n  highlight: 'highlight',\n} as const;\n\nconst BodyBitType = BodyBitTypeRaw;\n\nexport type BodyBitTypeKeys = keyof typeof BodyBitTypeRaw;\nexport type BodyBitTypeType = EnumType<typeof BodyBitType>;\n\nexport { BodyBitType };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst TextMarkType = {\n  // Styles\n  bold: 'bold',\n  light: 'light',\n  italic: 'italic',\n  highlight: 'highlight',\n  highlightOrange: 'highlightOrange',\n  highlightYellow: 'highlightYellow',\n  highlightGreen: 'highlightGreen',\n  highlightBlue: 'highlightBlue',\n  highlightPurple: 'highlightPurple',\n  highlightPink: 'highlightPink',\n  highlightBrown: 'highlightBrown',\n  highlightBlack: 'highlightBlack',\n  highlightWhite: 'highlightWhite',\n  highlightGray: 'highlightGray',\n\n  // Inline only styles\n  strike: 'strike',\n  subscript: 'subscript',\n  superscript: 'superscript',\n  ins: 'ins',\n  del: 'del',\n  underline: 'underline',\n  doubleUnderline: 'doubleUnderline',\n  smallcaps: 'smallcaps',\n  circle: 'circle',\n  languageEmRed: 'languageEmRed',\n  languageEmOrange: 'languageEmOrange',\n  languageEmYellow: 'languageEmYellow',\n  languageEmGreen: 'languageEmGreen',\n  languageEmBlue: 'languageEmBlue',\n  languageEmPurple: 'languageEmPurple',\n  languageEmPink: 'languageEmPink',\n  languageEmBrown: 'languageEmBrown',\n  languageEmBlack: 'languageEmBlack',\n  languageEmWhite: 'languageEmWhite',\n  languageEmGray: 'languageEmGray',\n  languageEm: 'languageEm',\n  userUnderline: 'userUnderline',\n  userDoubleUnderline: 'userDoubleUnderline',\n  userStrike: 'userStrike',\n  userCircle: 'userCircle',\n  userHighlight: 'userHighlight',\n  notranslate: 'notranslate',\n\n  // Attribute chain\n  link: 'link',\n  ref: 'ref',\n  xref: 'xref',\n  extref: 'extref',\n  footnote: 'footnote',\n  footnoteStar: 'footnote*',\n  symbol: 'symbol',\n  var: 'var',\n  code: 'code',\n  timer: 'timer',\n  duration: 'duration', // legacy: no longer produced by the parser (>= 8.41.1), accepted as generator input\n  color: 'color', // legacy: no longer produced by the parser (>= 8.41.1, now textStyle), accepted as generator input\n  textStyle: 'textStyle',\n  colorPicker: 'colorPicker',\n  comment: 'comment',\n} as const;\n\nexport type TextMarkTypeType = EnumType<typeof TextMarkType>;\n\nexport { TextMarkType };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst TextNodeType = {\n  // Text\n  text: 'text',\n\n  // Blocks\n  hardBreak: 'hardBreak',\n  paragraph: 'paragraph',\n  heading: 'heading',\n  section: 'section',\n  noBulletList: 'noBulletList',\n  bulletList: 'bulletList',\n  orderedList: 'orderedList',\n  orderedListRoman: 'orderedListRoman',\n  orderedListRomanLower: 'orderedListRomanLower',\n  letteredList: 'letteredList',\n  letteredListLower: 'letteredListLower',\n  taskList: 'taskList',\n  listItem: 'listItem',\n  taskItem: 'taskItem',\n  image: 'image',\n  imageInline: 'imageInline',\n  codeBlock: 'codeBlock',\n\n  // Inline blocks\n  latex: 'latex',\n\n  // Body bits\n  gap: 'gap',\n  select: 'select',\n  highlight: 'highlight',\n  mark: 'mark',\n} as const;\n\nexport type TextNodeTypeType = EnumType<typeof TextNodeType>;\n\nexport { TextNodeType };\n","import { type EnumType } from '@ncoderz/superenum';\n\n/**\n * Defines the type of a node in the AST.\n * All valid node types should be defined here.\n *\n * Nodes not defined here will not be walked by the AST walker.\n *\n * @enum\n */\nconst NodeType = {\n  unknown: 'unknown', // unknown\n\n  __isDefaultExample: '__isDefaultExample',\n  __typeAlias: '__typeAlias',\n\n  action: 'action',\n  actionValue: 'actionValue',\n  activityType: 'activityType',\n  activityTypeValue: 'activityTypeValue',\n  additionalSolutions: 'additionalSolutions',\n  additionalSolutionsValue: 'additionalSolutionsValue',\n  advertisingClickUrl: 'advertisingClickUrl',\n  advertisingClickUrlValue: 'advertisingClickUrlValue',\n  ageRange: 'ageRange',\n  ageRangeValue: 'ageRangeValue',\n  aiGenerated: 'aiGenerated',\n  aiGeneratedValue: 'aiGeneratedValue',\n  alias: 'alias', // bit type (alias)\n  alignment: 'alignment',\n  allowedBit: 'allowedBit',\n  allowedBitValue: 'allowedBitValue',\n  allowPrint: 'allowPrint',\n  allowPrintValue: 'allowPrintValue',\n  alt: 'alt',\n  alternativeAnswers: 'alternativeAnswers',\n  alternativeAnswersValue: 'alternativeAnswersValue',\n  alternativeDefinitions: 'alternativeDefinitions',\n  alternativeDefinitionsValue: 'alternativeDefinitionsValue',\n  altLangTag: 'altLangTag',\n  altLangTagValue: 'altLangTagValue',\n  analyticsTag: 'analyticsTag',\n  analyticsTagValue: 'analyticsTagValue',\n  anchor: 'anchor',\n  answer: 'answer',\n  appLink: 'appLink',\n  attrs: 'attrs',\n  audio: 'audio',\n  audioEmbed: 'audioEmbed',\n  audioLink: 'audioLink',\n  author: 'author',\n  authorFullName: 'authorFullName',\n  authorFullNameValue: 'authorFullNameValue',\n  authorJobTitle: 'authorJobTitle',\n  authorJobTitleValue: 'authorJobTitleValue',\n  authorPseudonym: 'authorPseudonym',\n  authorPseudonymValue: 'authorPseudonymValue',\n  authorTitle: 'authorTitle',\n  authorTitleValue: 'authorTitleValue',\n  authorValue: 'authorValue',\n  availableClassifications: 'availableClassifications',\n  availableClassificationsValue: 'availableClassificationsValue',\n  avatarImage: 'avatarImage',\n  backgroundWallpaper: 'backgroundWallpaper',\n  backgroundWallpaperValue: 'backgroundWallpaperValue',\n  backgroundImage: 'backgroundImage',\n  backgroundImageValue: 'backgroundImageValue',\n  bitLevel: 'bitLevel', // bit level\n  bitmarkAst: 'bitmarkAst', // bitmarkAst\n  bitmarkVersion: 'bitmarkVersion',\n  bits: 'bits', // bits\n  bitsValue: 'bitsValue', // bit\n  bitType: 'bitType', // bit type\n  bitFingerprint: 'bitFingerprint',\n  bitFingerprintValue: 'bitFingerprintValue',\n  blockId: 'blockId',\n  blockIdValue: 'blockIdValue',\n  body: 'body',\n  bodyBit: 'bodyBit',\n  bodyBits: 'bodyBits',\n  bodyJson: 'bodyJson',\n  bodyParts: 'bodyParts',\n  bodyPartsValue: 'bodyPartsValue',\n  bodyPartText: 'bodyPartText',\n  bodyText: 'bodyText',\n  bodyValue: 'bodyValue',\n  book: 'book',\n  bookAlias: 'bookAlias',\n  bookAliasValue: 'bookAliasValue',\n  bookAuthor: 'bookAuthor',\n  bookBindingType: 'bookBindingType',\n  bookDiff: 'bookDiff',\n  bookDiffValue: 'bookDiffValue',\n  bookIsbn: 'bookIsbn',\n  bookLanguage: 'bookLanguage',\n  bookNumberOfPages: 'bookNumberOfPages',\n  bookOriginalTitle: 'bookOriginalTitle',\n  bookPublisher: 'bookPublisher',\n  bookPublishingDate: 'bookPublishingDate',\n  bookRating: 'bookRating',\n  bookSeriesId: 'bookSeriesId',\n  bookSeriesNumber: 'bookSeriesNumber',\n  bookSeriesTitle: 'bookSeriesTitle',\n  bookTranslator: 'bookTranslator',\n  bookType: 'bookType',\n  bookValue: 'bookValue',\n  bot: 'bot',\n  botResponses: 'botResponses',\n  botResponsesValue: 'botResponsesValue',\n  botValue: 'botValue',\n  brandColor: 'brandColor',\n  brandColorName: 'brandColorName',\n  brandColorNameValue: 'brandColorNameValue',\n  brandColorValue: 'brandColorValue',\n  bubbleTag: 'bubbleTag',\n  bubbleTagValue: 'bubbleTagValue',\n  buttonCaption: 'buttonCaption',\n  buttonCaptionValue: 'buttonCaptionValue',\n  callToActionUrl: 'callToActionUrl',\n  callToActionUrlValue: 'callToActionUrlValue',\n  caption: 'caption',\n  captionDefinitionList: 'captionDefinitionList',\n  captionValue: 'captionValue',\n  cardBits: 'cardBits',\n  cardBitsValue: 'cardBitsValue',\n  cardNode: 'cardNode',\n  categoryTag: 'categoryTag',\n  categoryTagValue: 'categoryTagValue',\n  cells: 'cells',\n  cellsValue: 'cellsValue',\n  chatWithBook: 'chatWithBook',\n  chatWithBookBrainKey: 'chatWithBookBrainKey',\n  chatWithBookBrainKeyValue: 'chatWithBookBrainKeyValue',\n  chatWithBookValue: 'chatWithBookValue',\n  checked: 'checked',\n  choice: 'choice',\n  choices: 'choices',\n  choicesValue: 'choicesValue',\n  citationStyle: 'citationStyle',\n  citationStyleValue: 'citationStyleValue',\n  class: 'class',\n  classification: 'classification',\n  classificationValue: 'classificationValue',\n  codeLineNumbers: 'codeLineNumbers',\n  codeLineNumbersValue: 'codeLineNumbersValue',\n  codeMinimap: 'codeMinimap',\n  codeMinimapValue: 'codeMinimapValue',\n  color: 'color',\n  colorTag: 'colorTag',\n  colorTagValue: 'colorTagValue',\n  column: 'column',\n  columns: 'columns',\n  columnsValue: 'columnsValue',\n  comment: 'comment',\n  commentedBitType: 'commentedBitType',\n  computerLanguage: 'computerLanguage',\n  computerLanguageValue: 'computerLanguageValue',\n  content: 'contentValue',\n  content2Buy: 'content2Buy',\n  contentValue: 'contentValue',\n  contentValueValue: 'contentValueValue',\n  copyright: 'copyright',\n  coverColor: 'coverColor',\n  coverColorValue: 'coverColorValue',\n  coverImage: 'coverImage',\n  coverImageValue: 'coverImageValue',\n  currency: 'currency',\n  customerExternalId: 'customerExternalId',\n  customerId: 'customerId',\n  customerIdValue: 'customerIdValue',\n  customerProductId: 'customerProductId',\n  customerProductShopLink: 'customerProductShopLink',\n  data: 'data',\n  dataValue: 'dataValue',\n  dataValueValue: 'dataValueValue',\n  date: 'date',\n  dateEnd: 'dateEnd',\n  dateEndValue: 'dateEndValue',\n  dateValue: 'dateValue',\n  decimalPlaces: 'decimalPlaces',\n  deeplink: 'deeplink',\n  deeplinkValue: 'deeplinkValue',\n  definition: 'definition',\n  definitions: 'definitions',\n  definitionsValue: 'definitionsValue',\n  displayName: 'displayName',\n  displayNameValue: 'displayNameValue',\n  diffContext: 'diffContext',\n  diffContextValue: 'diffContextValue',\n  diffOp: 'diffOp',\n  diffOpValue: 'diffOpValue',\n  diffRef: 'diffRef',\n  diffRefValue: 'diffRefValue',\n  diffTime: 'diffTime',\n  diffTimeValue: 'diffTimeValue',\n  diffTo: 'diffTo',\n  diffToValue: 'diffToValue',\n  disableCalculation: 'disableCalculation',\n  disableFeedback: 'disableFeedback',\n  disableFeedbackValue: 'disableFeedbackValue',\n  document: 'document',\n  documentDownload: 'documentDownload',\n  documentEmbed: 'documentEmbed',\n  documentLink: 'documentLink',\n  duration: 'duration',\n  durationValue: 'durationValue',\n  elements: 'elements',\n  elementsValue: 'elementsValue',\n  elementsValueValue: 'elementsValueValue',\n  emphasis: 'emphasis',\n  end: 'end',\n  enforceUpdateOverUserInput: 'enforceUpdateOverUserInput',\n  enforceUpdateOverUserInputValue: 'enforceUpdateOverUserInputValue',\n  errors: 'errors',\n  errorsValue: 'errorsValue',\n  example: 'example',\n  exampleValue: 'exampleValue',\n  externalId: 'externalId',\n  externalIdValue: 'externalIdValue',\n  externalLink: 'externalLink',\n  externalLinkText: 'externalLinkText',\n  extractorExtractionTimestamp: 'extractorExtractionTimestamp',\n  extractorExtractionTimestampValue: 'extractorExtractionTimestampValue',\n  extractorTag: 'extractorTag',\n  extractorTagValue: 'extractorTagValue',\n  extractorInternal: 'extractorInternal',\n  extractorInternalValue: 'extractorInternalValue',\n  extraProperties: 'extraProperties',\n  feedback: 'feedback',\n  feedbackEngine: 'feedbackEngine',\n  feedbackEngineValue: 'feedbackEngineValue',\n  feedbacks: 'feedbacks',\n  feedbacksValue: 'feedbacksValue',\n  feedbackType: 'feedbackType',\n  flashcards: 'flashcards',\n  flashcardSet: 'flashcardSet',\n  flashcardSetValue: 'flashcardSetValue',\n  flashcardsValue: 'flashcardsValue',\n  focusX: 'focusX',\n  focusXValue: 'focusXValue',\n  focusY: 'focusY',\n  focusYValue: 'focusYValue',\n  footer: 'footer',\n  footerText: 'footerText',\n  footerValue: 'footerValue',\n  forKeys: 'forKeys',\n  format: 'format',\n  formula: 'formula',\n  formulaValue: 'formulaValue',\n  forValues: 'forValues',\n  forValuesValue: 'forValuesValue',\n  fullName: 'fullName',\n  fullNameValue: 'fullNameValue',\n  gap: 'gap',\n  gmbExternalShop: 'gmbExternalShop',\n  gmbExternalShopItems: 'gmbExternalShopItems',\n  groupTag: 'groupTag',\n  groupTagValue: 'groupTagValue',\n  gUri: 'gUri',\n  gUriValue: 'gUriValue',\n  handInAcceptFileType: 'handInAcceptFileType',\n  handInAcceptFileTypeValue: 'handInAcceptFileTypeValue',\n  handInInstruction: 'handInInstruction',\n  handInInstructionValue: 'handInInstructionValue',\n  handInRequirement: 'handInRequirement',\n  handInRequirementValue: 'handInRequirementValue',\n  hasBookNavigation: 'hasBookNavigation',\n  hasBookNavigationValue: 'hasBookNavigationValue',\n  hasMarkAsDone: 'hasMarkAsDone',\n  hasMarkAsDoneValue: 'hasMarkAsDoneValue',\n  hasPrintRestriction: 'hasPrintRestriction',\n  hasPrintRestrictionValue: 'hasPrintRestrictionValue',\n  head: 'head',\n  heading: 'heading',\n  height: 'height',\n  heightValue: 'heightValue',\n  highlight: 'highlight',\n  hint: 'hint',\n  hintValue: 'hintValue',\n  href: 'href',\n  icon: 'icon',\n  iconTag: 'iconTag',\n  iconTagValue: 'iconTagValue',\n  iconValue: 'iconValue',\n  id: 'id',\n  idValue: 'idValue',\n  iframeName: 'iframeName',\n  iframeSrc: 'iframeSrc',\n  image: 'image',\n  imageFirst: 'imageFirst',\n  imageFirstValue: 'imageFirstValue',\n  imageLandscape: 'imageLandscape',\n  imageLink: 'imageLink',\n  imagePlaceholder: 'imagePlaceholder',\n  imagePlaceholderValue: 'imagePlaceholderValue',\n  imagePortrait: 'imagePortrait',\n  imageSource: 'imageSource',\n  index: 'index',\n  indexValue: 'indexValue',\n  ingredients: 'ingredients',\n  ingredientsValue: 'ingredientsValue',\n  ingredient: 'ingredient',\n  ingredientValue: 'ingredientValue',\n  instruction: 'instruction',\n  instructionValue: 'instructionValue',\n  internalComment: 'internalComment',\n  internalCommentValue: 'internalCommentValue',\n  internalPrintPdf: 'internalPrintPdf',\n  internalPrintPdfValue: 'internalPrintPdfValue',\n  isCaseSensitive: 'isCaseSensitive',\n  isCollapsible: 'isCollapsible',\n  isCollapsibleValue: 'isCollapsibleValue',\n  isCommented: 'isCommented',\n  isCorrect: 'isCorrect',\n  isEditable: 'isEditable',\n  isEditableValue: 'isEditableValue',\n  isExample: 'isExample',\n  isInfoOnly: 'isInfoOnly',\n  isInfoOnlyValue: 'isInfoOnlyValue',\n  isPlain: 'isPlain',\n  isPublic: 'isPublic',\n  isPublicValue: 'isPublicValue',\n  isTemplate: 'isTemplate',\n  isTemplateStripTheme: 'isTemplateStripTheme',\n  isTemplateStripThemeValue: 'isTemplateStripThemeValue',\n  isTemplateValue: 'isTemplateValue',\n  isTracked: 'isTracked',\n  isTrackedValue: 'isTrackedValue',\n  item: 'item',\n  itemLead: 'itemLead',\n  itemValue: 'itemValue',\n  jobTitle: 'jobTitle',\n  jobTitleValue: 'jobTitleValue',\n  jupyterExecutionCount: 'jupyterExecutionCount',\n  jupyterExecutionCountValue: 'jupyterExecutionCountValue',\n  jupyterId: 'jupyterId',\n  jupyterIdValue: 'jupyterIdValue',\n  key: 'key',\n  keyAudio: 'keyAudio',\n  keyImage: 'keyImage',\n  kind: 'kind',\n  kindValue: 'kindValue',\n  label: 'label',\n  labelFalse: 'labelFalse',\n  labelFalseValue: 'labelFalseValue',\n  labelTrue: 'labelTrue',\n  labelTrueValue: 'labelTrueValue',\n  lang: 'lang',\n  language: 'language',\n  languageValue: 'languageValue',\n  langValue: 'langValue',\n  layer: 'layer',\n  layerRole: 'layerRole',\n  layerRoleValue: 'layerRoleValue',\n  layerValue: 'layerValue',\n  lead: 'lead',\n  leadValue: 'leadValue',\n  level: 'level',\n  levelACTFL: 'levelACTFL',\n  levelACTFLValue: 'levelACTFLValue',\n  levelCEFR: 'levelCEFR',\n  levelCEFRp: 'levelCEFRp',\n  levelCEFRpValue: 'levelCEFRpValue',\n  levelCEFRValue: 'levelCEFRValue',\n  levelILR: 'levelILR',\n  levelILRValue: 'levelILRValue',\n  license: 'license',\n  line: 'line',\n  list: 'list',\n  listItemIndent: 'listItemIndent',\n  listItemIndentValue: 'listItemIndentValue',\n  listPrice: 'listPrice',\n  listValue: 'listValue',\n  location: 'location',\n  locationValue: 'locationValue',\n  machineTranslated: 'machineTranslated',\n  machineTranslatedValue: 'machineTranslatedValue',\n  mailingList: 'mailingList',\n  marginNumber: 'marginNumber',\n  marginNumberValue: 'marginNumberValue',\n  mark: 'mark',\n  markConfig: 'markConfig',\n  markConfigValue: 'markConfigValue',\n  marks: 'marks',\n  marksValue: 'marksValue',\n  markup: 'markup', // bitmark markup\n  matrix: 'matrix',\n  matrixValue: 'matrixValue',\n  maxCreatedBits: 'maxCreatedBits',\n  maxCreatedBitsValue: 'maxCreatedBitsValue',\n  maxDisplayLevel: 'maxDisplayLevel',\n  maxDisplayLevelValue: 'maxDisplayLevelValue',\n  maxTocChapterLevel: 'maxTocChapterLevel',\n  maxTocChapterLevelValue: 'maxTocChapterLevelValue',\n  message: 'message',\n  mockupId: 'mockupId',\n  name: 'name',\n  needsValidation: 'needsValidation',\n  needsValidationValue: 'needsValidationValue',\n  offset: 'offset',\n  options: 'options',\n  optionsValue: 'optionsValue',\n  original: 'original',\n  padletId: 'padletId',\n  padletIdValue: 'padletIdValue',\n  page: 'page',\n  pageNo: 'pageNo',\n  pageNoValue: 'pageNoValue',\n  pageNumber: 'pageNumber',\n  pageNumberValue: 'pageNumberValue',\n  pageValue: 'pageValue',\n  pairs: 'pairs',\n  pairsValue: 'pairsValue',\n  parent: 'parent',\n  parser: 'parser',\n  partialAnswer: 'partialAnswer',\n  partialAnswerValue: 'partialAnswerValue',\n  path: 'path',\n  pathValue: 'pathValue',\n  person: 'person',\n  platformBackgroundColor: 'platformBackgroundColor',\n  platformBackgroundColorValue: 'platformBackgroundColorValue',\n  platformBackgroundImage: 'platformBackgroundImage',\n  platformBackgroundImageValue: 'platformBackgroundImageValue',\n  platformBaseLayerColor: 'platformBaseLayerColor',\n  platformBaseLayerColorValue: 'platformBaseLayerColorValue',\n  platformBorderColor: 'platformBorderColor',\n  platformBorderColorValue: 'platformBorderColorValue',\n  platformBorderRadius: 'platformBorderRadius',\n  platformBorderRadiusValue: 'platformBorderRadiusValue',\n  platformBrandTarget: 'platformBrandTarget',\n  platformBrandTargetValue: 'platformBrandTargetValue',\n  platformButtonBackgroundColor: 'platformButtonBackgroundColor',\n  platformButtonBackgroundColorValue: 'platformButtonBackgroundColorValue',\n  platformButtonPrimaryColor: 'platformButtonPrimaryColor',\n  platformButtonPrimaryColorValue: 'platformButtonPrimaryColorValue',\n  platformIcon: 'platformIcon',\n  platformIconValue: 'platformIconValue',\n  platformLogo: 'platformLogo',\n  platformLogoMaxHeight: 'platformLogoMaxHeight',\n  platformLogoMaxHeightValue: 'platformLogoMaxHeightValue',\n  platformLogoValue: 'platformLogoValue',\n  platformMargin: 'platformMargin',\n  platformMarginValue: 'platformMarginValue',\n  platformMessageBackgroundColor: 'platformMessageBackgroundColor',\n  platformMessageBackgroundColorValue: 'platformMessageBackgroundColorValue',\n  platformName: 'platformName',\n  platformNameValue: 'platformNameValue',\n  platformNeedsShadow: 'platformNeedsShadow',\n  platformNeedsShadowValue: 'platformNeedsShadowValue',\n  platformPlaceholderColor: 'platformPlaceholderColor',\n  platformPlaceholderColorValue: 'platformPlaceholderColorValue',\n  platformPrimaryColor: 'platformPrimaryColor',\n  platformPrimaryColorValue: 'platformPrimaryColorValue',\n  platformScrollbarColor: 'platformScrollbarColor',\n  platformScrollbarColorValue: 'platformScrollbarColorValue',\n  platformSecondaryColor: 'platformSecondaryColor',\n  platformSecondaryColorValue: 'platformSecondaryColorValue',\n  platformSelectionBorderRadius: 'platformSelectionBorderRadius',\n  platformSelectionBorderRadiusValue: 'platformSelectionBorderRadiusValue',\n  platformSelectionColor: 'platformSelectionColor',\n  platformSelectionColorValue: 'platformSelectionColorValue',\n  platformSelectionTextColor: 'platformSelectionTextColor',\n  platformSelectionTextColorValue: 'platformSelectionTextColorValue',\n  platformSeparatorColor: 'platformSeparatorColor',\n  platformSeparatorColorValue: 'platformSeparatorColorValue',\n  platformTextSelectionColor: 'platformTextSelectionColor',\n  platformTextSelectionColorValue: 'platformTextSelectionColorValue',\n  pointerLeft: 'pointerLeft',\n  pointerLeftValue: 'pointerLeftValue',\n  pointerTop: 'pointerTop',\n  pointerTopValue: 'pointerTopValue',\n  posterImage: 'posterImage',\n  posterImageValue: 'posterImageValue',\n  postfix: 'postfix',\n  prefix: 'prefix',\n  previewImage: 'previewImage',\n  previewImageValue: 'previewImageValue',\n  previewVideo: 'previewVideo',\n  previewVideoValue: 'previewVideoValue',\n  printParentChapterLevel: 'printParentChapterLevel',\n  printParentChapterLevelValue: 'printParentChapterLevelValue',\n  printOnRequestCustomerId: 'printOnRequestCustomerId',\n  printOnRequestCustomerIdValue: 'printOnRequestCustomerIdValue',\n  printOnRequestProductId: 'printOnRequestProductId',\n  printOnRequestProductIdValue: 'printOnRequestProductIdValue',\n  processHandIn: 'processHandIn',\n  processHandInLocation: 'processHandInLocation',\n  processHandInLocationValue: 'processHandInLocationValue',\n  processHandInValue: 'processHandInValue',\n  product: 'product',\n  productFolder: 'productFolder',\n  productFolderValue: 'productFolderValue',\n  productId: 'productId',\n  productIdValue: 'productIdValue',\n  productList: 'productList',\n  productListValue: 'productListValue',\n  productValue: 'productValue',\n  productVideo: 'productVideo',\n  productVideoList: 'productVideoList',\n  productVideoListValue: 'productVideoListValue',\n  productVideoValue: 'productVideoValue',\n  progress: 'progress',\n  progressValue: 'progressValue',\n  pronunciationTable: 'pronunciationTable',\n  properties: 'properties',\n  property: 'property',\n  propertyKey: 'propertyKey',\n  propertyValue: 'propertyValue',\n  propertyValues: 'propertyValues',\n  provider: 'provider',\n  pseudonym: 'pseudonym',\n  pseudonymValue: 'pseudonymValue',\n  publications: 'publications',\n  publicationsValue: 'publicationsValue',\n  publisher: 'publisher',\n  publisherName: 'publisherName',\n  publisherNameValue: 'publisherNameValue',\n  publisherValue: 'publisherValue',\n  quantity: 'quantity',\n  question: 'question',\n  questions: 'questions',\n  questionsValue: 'questionsValue',\n  questionValue: 'questionValue',\n  quizCountItems: 'quizCountItems',\n  quizCountItemsValue: 'quizCountItemsValue',\n  quizStrikethroughSolutions: 'quizStrikethroughSolutions',\n  quizStrikethroughSolutionsValue: 'quizStrikethroughSolutionsValue',\n  quizzes: 'quizzes',\n  quizzesValue: 'quizzesValue',\n  quotedPerson: 'quotedPerson',\n  ratingLevelEnd: 'ratingLevelEnd',\n  ratingLevelSelected: 'ratingLevelSelected',\n  ratingLevelSelectedValue: 'ratingLevelSelectedValue',\n  ratingLevelStart: 'ratingLevelStart',\n  reaction: 'reaction',\n  reason: 'reason',\n  reasonableNumOfChars: 'reasonableNumOfChars',\n  reasonableNumOfCharsValue: 'reasonableNumOfCharsValue',\n  reductionTag: 'reductionTag',\n  reductionTagValue: 'reductionTagValue',\n  refAuthor: 'refAuthor',\n  refBookTitle: 'refBookTitle',\n  reference: 'reference',\n  referenceEnd: 'referenceEnd',\n  referenceProperty: 'referenceProperty',\n  referencePropertyValue: 'referencePropertyValue',\n  refPublicationYear: 'refPublicationYear',\n  refPublisher: 'refPublisher',\n  relatedBook: 'relatedBook',\n  relatedBookValue: 'relatedBookValue',\n  translationOfBook: 'translationOfBook',\n  translationOfBookValue: 'translationOfBookValue',\n  userFeedbackTranslationUrl: 'userFeedbackTranslationUrl',\n  userFeedbackTranslationUrlValue: 'userFeedbackTranslationUrlValue',\n  userFeedbackContentUrl: 'userFeedbackContentUrl',\n  userFeedbackContentUrlValue: 'userFeedbackContentUrlValue',\n  releaseDate: 'releaseDate',\n  releaseDateValue: 'releaseDateValue',\n  releaseKind: 'releaseKind',\n  releaseKindValue: 'releaseKindValue',\n  releaseVersion: 'releaseVersion',\n  releaseVersionValue: 'releaseVersionValue',\n  reportTag: 'reportTag',\n  reportTagValue: 'reportTagValue',\n  resolved: 'resolved',\n  resolvedBy: 'resolvedBy',\n  resolvedByValue: 'resolvedByValue',\n  resolvedDate: 'resolvedDate',\n  resolvedDateValue: 'resolvedDateValue',\n  resolvedValue: 'resolvedValue',\n  resources: 'resources',\n  resourcesValue: 'resourcesValue',\n  resourceType: 'resourceType',\n  response: 'response',\n  responses: 'responses',\n  responsesValue: 'responsesValue',\n  revealSolutions: 'revealSolutions',\n  reviewTag: 'reviewTag',\n  reviewTagValue: 'reviewTagValue',\n  reviewerTag: 'reviewerTag',\n  reviewerTagValue: 'reviewerTagValue',\n  rightsPolicy: 'rightsPolicy',\n  rightsPolicyValue: 'rightsPolicyValue',\n  root: 'root', // bit type (root)\n  rows: 'rows',\n  rowsValue: 'rowsValue',\n  rtl: 'rtl',\n  rtlValue: 'rtlValue',\n  rubric: 'rubric',\n  rubricValue: 'rubricValue',\n  sampleSolution: 'sampleSolution',\n  sampleSolutionValue: 'sampleSolutionValue',\n  scormSource: 'scormSource',\n  scormSourceValue: 'scormSourceValue',\n  search: 'search',\n  searchIndex: 'searchIndex',\n  searchIndexValue: 'searchIndexValue',\n  searchValue: 'searchValue',\n  section: 'section',\n  select: 'select',\n  selected: 'selected',\n  servings: 'servings',\n  servingsValue: 'servingsValue',\n  showInIndex: 'showInIndex',\n  showInIndexValue: 'showInIndexValue',\n  size: 'size',\n  slug: 'slug',\n  slugValue: 'slugValue',\n  solution: 'solution',\n  solutions: 'solutions',\n  solutionsValue: 'solutionsValue',\n  sourceBB: 'sourceBB',\n  sourceBBValue: 'sourceBBValue',\n  sourceDocument: 'sourceDocument',\n  sourceDocumentValue: 'sourceDocumentValue',\n  sourceRL: 'sourceRL',\n  sourceRLValue: 'sourceRLValue',\n  spaceId: 'spaceId',\n  spaceIdValue: 'spaceIdValue',\n  spansPageBreak: 'spansPageBreak',\n  spansPageBreakValue: 'spansPageBreakValue',\n  src: 'src',\n  src1x: 'src1x',\n  src2x: 'src2x',\n  src3x: 'src3x',\n  src4x: 'src4x',\n  srcAlt: 'srcAlt',\n  srcAltValue: 'srcAltValue',\n  start: 'start',\n  statement: 'statement',\n  statementValue: 'statementValue',\n  statements: 'statements',\n  statementsValue: 'statementsValue',\n  statementText: 'statementText',\n  stillImageFilmEmbed: 'stillImageFilmEmbed',\n  stillImageFilmLink: 'stillImageFilmLink',\n  stripePricingTableId: 'stripePricingTableId',\n  stripePricingTableIdValue: 'stripePricingTableIdValue',\n  stripePricingTableDescriptiveName: 'stripePricingTableDescriptiveName',\n  stripePricingTableDescriptiveNameValue: 'stripePricingTableDescriptiveNameValue',\n  stripePublishableKey: 'stripePublishableKey',\n  stripePublishableKeyValue: 'stripePublishableKeyValue',\n  subject: 'subject',\n  subjectValue: 'subjectValue',\n  subtitle: 'subtitle',\n  subtitleValue: 'subtitleValue',\n  subtype: 'subtype',\n  subtypeValue: 'subtypeValue',\n  table: 'table',\n  tableAutoWidth: 'tableAutoWidth',\n  tableAutoWidthValue: 'tableAutoWidthValue',\n  tableColWidth: 'tableColWidth',\n  tableColWidthValue: 'tableColWidthValue',\n  tableColumnMinWidth: 'tableColumnMinWidth',\n  tableColumnMinWidthValue: 'tableColumnMinWidthValue',\n  tableFixedHeader: 'tableFixedHeader',\n  tableFixedHeaderValue: 'tableFixedHeaderValue',\n  tableHeaderWhitespaceNoWrap: 'tableHeaderWhitespaceNoWrap',\n  tableHeaderWhitespaceNoWrapValue: 'tableHeaderWhitespaceNoWrapValue',\n  tableHeight: 'tableHeight',\n  tableHeightValue: 'tableHeightValue',\n  tablePagination: 'tablePagination',\n  tablePaginationLimit: 'tablePaginationLimit',\n  tablePaginationLimitValue: 'tablePaginationLimitValue',\n  tablePaginationValue: 'tablePaginationValue',\n  tableResizableColumns: 'tableResizableColumns',\n  tableResizableColumnsValue: 'tableResizableColumnsValue',\n  tableSearch: 'tableSearch',\n  tableSearchValue: 'tableSearchValue',\n  tableSort: 'tableSort',\n  tableSortValue: 'tableSortValue',\n  tableWhitespaceNoWrap: 'tableWhitespaceNoWrap',\n  tableWhitespaceNoWrapValue: 'tableWhitespaceNoWrapValue',\n  tag: 'tag',\n  tagValue: 'tagValue',\n  target: 'target',\n  targetValue: 'targetValue',\n  technicalTerm: 'technicalTerm',\n  technicalTermValue: 'technicalTermValue',\n  term: 'term',\n  text: 'text',\n  textAlign: 'textAlign',\n  textAst: 'textAst',\n  textAstValue: 'textAstValue',\n  textFormat: 'textFormat',\n  textReference: 'textReference',\n  textReferenceValue: 'textReferenceValue',\n  texts: 'texts',\n  textsValue: 'textsValue',\n  theme: 'theme',\n  themeValue: 'themeValue',\n  thumbImage: 'thumbImage',\n  thumbImageValue: 'thumbImageValue',\n  thumbnails: 'thumbnails',\n  thumbnailsValue: 'thumbnailsValue',\n  title: 'title',\n  titleString: 'titleString',\n  titleValue: 'titleValue',\n  toc: 'toc',\n  tocContent: 'tocContent',\n  tocContentValue: 'tocContentValue',\n  tocResource: 'tocResource',\n  tocResourceValue: 'tocResourceValue',\n  tocValue: 'tocValue',\n  topicTag: 'topicTag',\n  topicTagValue: 'topicTagValue',\n  translationOf: 'translationOf',\n  translationOfValue: 'translationOfValue',\n  trim: 'trim',\n  type: 'type',\n  unit: 'unit',\n  unitAbbr: 'unitAbbr',\n  unitAbbrPlural: 'unitAbbrPlural',\n  unitPlural: 'unitPlural',\n  url: 'url',\n  validationDate: 'validationDate',\n  validationDateValue: 'validationDateValue',\n  value: 'value',\n  values: 'values',\n  valuesValue: 'valuesValue',\n  vendorDashboardId: 'vendorDashboardId',\n  vendorDashboardIdValue: 'vendorDashboardIdValue',\n  vendorSurveyId: 'vendorSurveyId',\n  vendorSurveyIdValue: 'vendorSurveyIdValue',\n  vendorUrl: 'vendorUrl',\n  vendorUrlValue: 'vendorUrlValue',\n  version: 'version',\n  video: 'video',\n  videoCallLink: 'videoCallLink',\n  videoCallLinkValue: 'videoCallLinkValue',\n  videoEmbed: 'videoEmbed',\n  videoLink: 'videoLink',\n  warnings: 'warnings',\n  warningsValue: 'warningsValue',\n  websiteLink: 'websiteLink',\n  width: 'width',\n  widthValue: 'widthValue',\n  x: 'x',\n  xValue: 'xValue',\n  y: 'y',\n  yValue: 'yValue',\n  zoomDisabled: 'zoomDisabled',\n} as const;\n\nexport type NodeTypeType = EnumType<typeof NodeType>;\n\nexport { NodeType };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { Breakscape } from '../breakscaping/Breakscape.ts';\nimport { Config } from '../config/Config.ts';\nimport { type BreakscapedString } from '../model/ast/BreakscapedString.ts';\nimport {\n  type Bit,\n  type BitmarkAst,\n  type Body,\n  type CardBit,\n  type CardNode,\n  type ExtraProperties,\n  type Footer,\n  type Property,\n} from '../model/ast/Nodes.ts';\nimport { type JsonText, type TextAst, type TextNode } from '../model/ast/TextNodes.ts';\nimport { ConfigKey } from '../model/config/enum/ConfigKey.ts';\nimport type { PropertyTagConfig } from '../model/config/PropertyTagConfig.ts';\nimport { BitType, type BitTypeType } from '../model/enum/BitType.ts';\nimport { BodyBitType, type BodyBitTypeType } from '../model/enum/BodyBitType.ts';\nimport { DeprecatedTextFormat } from '../model/enum/DeprecatedTextFormat.ts';\nimport { ResourceType, type ResourceTypeType } from '../model/enum/ResourceType.ts';\nimport { TextFormat, type TextFormatType } from '../model/enum/TextFormat.ts';\nimport { TextLocation } from '../model/enum/TextLocation.ts';\nimport {\n  type BookJson,\n  type BotResponseJson,\n  type ChoiceJson,\n  type DefinitionListItemJson,\n  type ExampleJson,\n  type FeedbackChoiceJson,\n  type FeedbackJson,\n  type FeedbackReasonJson,\n  type FlashcardJson,\n  type GroupTagJson,\n  type HeadingJson,\n  type ImageSourceJson,\n  type IngredientJson,\n  type MarkConfigJson,\n  type MatrixCellJson,\n  type MatrixJson,\n  type PairJson,\n  type PersonJson,\n  type PronunciationTableJson,\n  type QuestionJson,\n  type QuizJson,\n  type RatingLevelStartEndJson,\n  type ResponseJson,\n  type ServingsJson,\n  type StatementJson,\n  type TableCellJson,\n  type TableExtendedJson,\n  type TableJson,\n  type TableRowJson,\n  type TableSectionJson,\n  type TechnicalTermJson,\n  type TextAndIconJson,\n} from '../model/json/BitJson.ts';\nimport {\n  type BodyBitJson,\n  type GapJson,\n  type HighlightJson,\n  type HighlightTextJson,\n  type MarkJson,\n  type SelectJson,\n  type SelectOptionJson,\n} from '../model/json/BodyBitJson.ts';\nimport {\n  type AudioResourceWrapperJson,\n  type ImageResourceWrapperJson,\n  type ResourceJson,\n  type VideoResourceWrapperJson,\n} from '../model/json/ResourceJson.ts';\nimport { type ParserError } from '../model/parser/ParserError.ts';\nimport { type ParserInfo } from '../model/parser/ParserInfo.ts';\nimport { normalizeTableFormat } from '../parser/json/TableUtils.ts';\nimport { ArrayUtils } from '../utils/ArrayUtils.ts';\nimport { BitUtils } from '../utils/BitUtils.ts';\nimport { BooleanUtils } from '../utils/BooleanUtils.ts';\nimport { env } from '../utils/env/Env.ts';\nimport { NumberUtils } from '../utils/NumberUtils.ts';\nimport { ObjectUtils } from '../utils/ObjectUtils.ts';\nimport { StringUtils } from '../utils/StringUtils.ts';\nimport { BaseBuilder, type BuildContext, type WithExampleJson } from './BaseBuilder.ts';\nimport { ResourceBuilder } from './ResourceBuilder.ts';\nimport { NodeValidator } from './rules/NodeValidator.ts';\n\nexport interface BuildBitOptions {\n  cardSet?: {\n    sideNo: number; // Side number of the card set\n    variantNo: number; // Variant number of the card set\n  };\n}\n\n/**\n * Builder to build bitmark AST node programmatically\n */\nclass Builder extends BaseBuilder {\n  private resourceBuilder: ResourceBuilder = new ResourceBuilder();\n\n  /**\n   * Build bitmark node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  buildBitmark(data: { bits?: Bit[]; errors?: ParserError[] }): BitmarkAst {\n    const { bits, errors } = data;\n\n    const node: BitmarkAst = {\n      bits,\n      errors,\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node);\n\n    return node;\n  }\n\n  /**\n   * Build bit node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  buildBit(\n    data: {\n      bitType: BitTypeType;\n      bitLevel: number;\n      textFormat?: TextFormatType;\n      resourceType?: ResourceTypeType; // This is optional, it will be inferred from the resource\n      isCommented?: boolean;\n      id?: string | string[];\n      gUri?: string;\n      internalComment?: string | string[];\n      customerId?: string;\n      customerExternalId?: string | string[];\n      externalId?: string | string[];\n      spaceId?: string | string[];\n      padletId?: string;\n      jupyterId?: string;\n      jupyterExecutionCount?: number;\n      copyright?: string;\n      license?: string;\n      rightsPolicy?: string | string[];\n      sourceRL?: string;\n      isPublic?: boolean;\n      isTemplate?: boolean;\n      isTemplateStripTheme?: boolean;\n      isEditable?: boolean;\n      needsValidation?: boolean;\n      validationDate?: string;\n      aiGenerated?: boolean;\n      machineTranslated?: string;\n      translationOf?: string;\n      spansPageBreak?: boolean;\n      searchIndex?: string | string[];\n      analyticsTag?: string | string[];\n      categoryTag?: string | string[];\n      topicTag?: string | string[];\n      reportTag?: string | string[];\n      altLangTag?: string;\n      feedbackEngine?: string;\n      feedbackType?: string;\n      disableFeedback?: boolean;\n      diffTo?: string;\n      diffOp?: string;\n      diffRef?: string;\n      diffContext?: string;\n      diffTime?: number;\n      path?: string;\n      releaseVersion?: string;\n      releaseKind?: string;\n      releaseDate?: string;\n      iframeSrc?: string;\n      iframeName?: string;\n      ageRange?: number | number[];\n      lang?: string;\n      language?: string | string[];\n      publisher?: string | string[];\n      publisherName?: string;\n      displayName?: string;\n      theme?: string | string[];\n      rtl?: boolean;\n      computerLanguage?: string;\n      target?: string | string[];\n      slug?: string;\n      tag?: string | string[];\n      groupTag?: Partial<GroupTagJson> | Partial<GroupTagJson>[];\n      reviewTag?: string | string[];\n      reviewerTag?: string | string[];\n      reductionTag?: string | string[];\n      bubbleTag?: string | string[];\n      extractorTag?: string | string[];\n      extractorInternal?: string | string[];\n      sourceBB?: number[] | number[][];\n      bitFingerprint?: string | string[];\n      levelCEFRp?: string | string[];\n      levelCEFR?: string | string[];\n      levelILR?: string | string[];\n      levelACTFL?: string | string[];\n      icon?: string;\n      iconTag?: string;\n      colorTag?: string | string[];\n      flashcardSet?: string | string[];\n      subtype?: string;\n      bookAlias?: string | string[];\n      bookDiff?: string;\n      coverImage?: string | string[] | Partial<ImageResourceWrapperJson>;\n      coverColor?: string;\n      backgroundImage?: string | string[] | Partial<ImageResourceWrapperJson>;\n      publications?: string | string[];\n      relatedBook?: string | string[];\n      translationOfBook?: string;\n      userFeedbackTranslationUrl?: string;\n      userFeedbackContentUrl?: string;\n      author?: string | string[];\n      subject?: string | string[];\n      date?: string;\n      dateEnd?: string;\n      location?: string;\n      kind?: string;\n      hasMarkAsDone?: boolean;\n      processHandIn?: boolean;\n      processHandInLocation?: string;\n      chatWithBook?: boolean;\n      chatWithBookBrainKey?: string;\n      currency?: string;\n      bookIsbn?: string;\n      bookAuthor?: string;\n      bookType?: string;\n      bookBindingType?: string;\n      bookNumberOfPages?: string;\n      bookRating?: string;\n      bookSeriesTitle?: string;\n      bookSeriesId?: string;\n      bookSeriesNumber?: string;\n      bookLanguage?: string;\n      bookPublishingDate?: string;\n      bookPublisher?: string;\n      bookTranslator?: string;\n      bookOriginalTitle?: string;\n      gmbExternalShop?: string;\n      gmbExternalShopItems?: string | string[];\n      action?: string;\n      showInIndex?: boolean;\n      refAuthor?: string | string[];\n      refBookTitle?: string;\n      refPublisher?: string | string[];\n      refPublicationYear?: string;\n      citationStyle?: string;\n      blockId?: string;\n      pageNo?: number;\n      x?: number;\n      y?: number;\n      width?: string;\n      height?: string;\n      index?: number;\n      classification?: string;\n      availableClassifications?: string | string[];\n      allowedBit?: string | string[];\n      authorFullName?: string;\n      authorPseudonym?: string;\n      authorTitle?: string;\n      authorJobTitle?: string;\n      tableFixedHeader?: boolean;\n      tableHeaderWhitespaceNoWrap?: boolean;\n      tableSearch?: boolean;\n      tableSort?: boolean;\n      tablePagination?: boolean;\n      tablePaginationLimit?: number;\n      tableHeight?: number;\n      tableWhitespaceNoWrap?: boolean;\n      tableAutoWidth?: boolean;\n      tableResizableColumns?: boolean;\n      tableColumnMinWidth?: number;\n      quizCountItems?: boolean;\n      quizStrikethroughSolutions?: boolean;\n      codeLineNumbers?: boolean;\n      codeMinimap?: boolean;\n      stripePricingTableId?: string;\n      stripePricingTableDescriptiveName?: string;\n      stripePublishableKey?: string;\n      thumbImage?: string;\n      scormSource?: string;\n      posterImage?: string;\n      focusX?: number;\n      focusY?: number;\n      pointerLeft?: string;\n      pointerTop?: string;\n      listItemIndent?: number;\n      backgroundWallpaper?: Partial<ImageResourceWrapperJson>;\n      hasBookNavigation?: boolean;\n      duration?: string;\n      referenceProperty?: string | string[];\n      deeplink?: string | string[];\n      externalLink?: string;\n      externalLinkText?: string;\n      videoCallLink?: string;\n      vendorDashboardId?: string;\n      vendorSurveyId?: string;\n      vendorUrl?: string;\n      search?: string;\n      bot?: string | string[];\n      fullName?: string;\n      pseudonym?: string;\n      titleString?: string;\n      jobTitle?: string;\n      list?: string | string[];\n      layer?: string | string[];\n      layerRole?: string | string[];\n      textReference?: string;\n      isTracked?: boolean;\n      isInfoOnly?: boolean;\n      imageFirst?: boolean;\n      activityType?: string;\n      labelTrue?: string;\n      labelFalse?: string;\n      content2Buy?: string;\n      listPrice?: string;\n      customerProductId?: string;\n      customerProductShopLink?: string;\n      mailingList?: string;\n      buttonCaption?: string;\n      callToActionUrl?: string;\n      advertisingClickUrl?: string;\n      brandColor?: string;\n      brandColorName?: string;\n      caption?: JsonText;\n      quotedPerson?: string;\n      reasonableNumOfChars?: number;\n      resolved?: boolean;\n      resolvedDate?: string;\n      resolvedBy?: string;\n      handInAcceptFileType?: string | string[];\n      handInRequirement?: string | string[];\n      handInInstruction?: string;\n      maxCreatedBits?: number;\n      maxDisplayLevel?: number;\n      maxTocChapterLevel?: number;\n      sourceDocument?: string;\n      internalPrintPdf?: string;\n      allowPrint?: string; // 'enforceTrue' | 'enforceFalse' | 'useSpaceConfiguration'\n      hasPrintRestriction?: boolean;\n      enforceUpdateOverUserInput?: boolean;\n      extractorExtractionTimestamp?: string[];\n      tocResource?: string | string[];\n      tocContent?: string | string[];\n      page?: string | string[];\n      printParentChapterLevel?: number;\n      printOnRequestCustomerId?: string;\n      printOnRequestProductId?: string;\n      platformBrandTarget?: string;\n      platformName?: string;\n      platformIcon?: Partial<ImageResourceWrapperJson>;\n      platformLogo?: Partial<ImageResourceWrapperJson>;\n      platformLogoMaxHeight?: number;\n      platformPrimaryColor?: string;\n      platformSecondaryColor?: string;\n      platformBackgroundColor?: string;\n      platformScrollbarColor?: string;\n      platformSelectionColor?: string;\n      platformSeparatorColor?: string;\n      platformPlaceholderColor?: string;\n      platformTextSelectionColor?: string;\n      platformButtonPrimaryColor?: string;\n      platformButtonBackgroundColor?: string;\n      platformMessageBackgroundColor?: string;\n      platformBackgroundImage?: Partial<ImageResourceWrapperJson>;\n      platformBorderColor?: string;\n      platformSelectionTextColor?: string;\n      platformBaseLayerColor?: string;\n      platformMargin?: number;\n      platformBorderRadius?: number;\n      platformSelectionBorderRadius?: number;\n      platformNeedsShadow?: boolean;\n      productId?: string | string[];\n      product?: string | string[];\n      // productList?: string | string[];\n      productVideo?: string | string[];\n      // productVideoList?: string | string[];\n      productFolder?: string;\n      technicalTerm?: Partial<TechnicalTermJson>;\n      servings?: Partial<ServingsJson>;\n      ratingLevelStart?: Partial<RatingLevelStartEndJson>;\n      ratingLevelEnd?: Partial<RatingLevelStartEndJson>;\n      ratingLevelSelected?: number;\n      formula?: string;\n      partialAnswer?: string;\n      book?: string | BookJson[];\n      title?: JsonText;\n      subtitle?: JsonText;\n      level?: number | string;\n      toc?: boolean;\n      progress?: boolean;\n      isCollapsible?: boolean;\n      anchor?: string;\n      reference?: string;\n      referenceEnd?: string;\n      revealSolutions?: boolean;\n      isCaseSensitive?: boolean;\n      item?: JsonText;\n      lead?: JsonText;\n      pageNumber?: JsonText;\n      marginNumber?: JsonText;\n      hint?: JsonText;\n      instruction?: JsonText;\n      example?: Partial<ExampleJson>;\n      imageSource?: Partial<ImageSourceJson>;\n      person?: Partial<PersonJson>;\n      extraProperties?: {\n        [key: string]: unknown | unknown[];\n      };\n\n      markConfig?: Partial<MarkConfigJson>[];\n      previewImage?: Partial<ImageResourceWrapperJson> | Partial<ImageResourceWrapperJson>[];\n      previewVideo?: Partial<VideoResourceWrapperJson> | Partial<VideoResourceWrapperJson>[];\n      imagePlaceholder?: Partial<ImageResourceWrapperJson>;\n      resources?: Partial<ResourceJson> | Partial<ResourceJson>[];\n      body?: Partial<Body>;\n      sampleSolution?: string;\n      additionalSolutions?: string | string[];\n      heading?: Partial<HeadingJson>;\n      elements?: JsonText[];\n      flashcards?: Partial<FlashcardJson>[];\n      definitions?: Partial<DefinitionListItemJson>[];\n      legend?: Partial<DefinitionListItemJson>[];\n      statement?: Partial<StatementJson>;\n      statements?: Partial<StatementJson>[];\n      responses?: Partial<ResponseJson>[];\n      quizzes?: Partial<QuizJson>[];\n      pairs?: Partial<PairJson>[];\n      matrix?: Partial<MatrixJson>[];\n      pronunciationTable?: Partial<PronunciationTableJson>;\n      table?: Partial<TableJson | TableExtendedJson>;\n      choices?: Partial<ChoiceJson>[];\n      questions?: Partial<QuestionJson>[];\n      botResponses?: Partial<BotResponseJson>[];\n      ingredients?: Partial<IngredientJson>[];\n      // DEPRECATED - TO BE REMOVED IN THE FUTURE\n      // captionDefinitionList?: Partial<CaptionDefinitionListJson>;\n      cardBits?: Partial<CardBit>[];\n      footer?: Partial<Footer>;\n\n      markup?: string;\n      parser?: ParserInfo;\n      __isDefaultExample?: boolean;\n    },\n    options?: BuildBitOptions,\n  ): Bit | undefined {\n    // Copy all data to a new object to avoid modifying the original data\n    data = structuredClone(data);\n\n    // PLAN-017: migrate the deprecated `*-collapsible` bit types to their non-collapsible cousin\n    // plus `isCollapsible`. Done here because both parse paths (bitmark PEG and JSON) converge on\n    // buildBit(), so bitmark and JSON input migrate and both generators emit the new form.\n    // Must run BEFORE the bit config is resolved. `?? true` keeps PLAN-016 semantics: an explicit\n    // `isCollapsible: false` in the source still wins (and still yields no JSON key).\n    const migratedBitType = Config.getMigratedBitType(data.bitType);\n    if (migratedBitType) {\n      data.bitType = migratedBitType;\n      data.isCollapsible = data.isCollapsible ?? true;\n    }\n\n    const bitType = data.bitType;\n    const bitConfig = Config.getBitConfig(bitType);\n\n    // PLAN-016: the deprecated `*-collapsible` bit types override @isCollapsible\n    // with `defaultValue: 'true'`. Materialise that default into the AST when the\n    // tag is absent, so both generators (and the exported config) agree. Scoped to\n    // this tag only — other `defaultValue: 'true'` tags are not materialised.\n    const isCollapsibleDefaultsTrue =\n      (bitConfig.tags[ConfigKey.property_isCollapsible] as PropertyTagConfig | undefined)\n        ?.defaultValue === 'true';\n\n    // Text Format (accepts deprecated values, and converts them to the new format)\n    const deprecatedTextFormat = Enum(DeprecatedTextFormat).fromValue(data.textFormat);\n    let textFormat = Enum(TextFormat).fromValue(data.textFormat) ?? bitConfig.textFormatDefault;\n    if (deprecatedTextFormat === DeprecatedTextFormat.bitmarkMinusMinus) {\n      textFormat = TextFormat.bitmarkText;\n    }\n\n    const context: BuildContext = {\n      bitConfig,\n      bitType,\n      textFormat,\n    };\n\n    // Validate and convert resources, and ensure it is an array\n    // const resources = ArrayUtils.asArray(resourcesIn);\n\n    // Set the card node data\n    const cardNode = this.buildCardNode(context, data);\n\n    // Add reasonableNumOfChars to the bit only for essay bits (in other cases it will be pushed down the tree)\n    const reasonableNumOfCharsProperty = Config.isOfBitType(data.bitType, BitType.essay)\n      ? this.toAstProperty(\n          bitType,\n          ConfigKey.property_reasonableNumOfChars,\n          data.reasonableNumOfChars,\n          options,\n        )\n      : undefined;\n\n    const convertedExample = {\n      ...this.toExample(data.__isDefaultExample, data.example as TextAst),\n    };\n\n    // NOTE: Node order is important and is defined here\n    const node: Bit = {\n      bitType,\n      bitLevel: data.bitLevel,\n      textFormat,\n      resourceType: Enum(ResourceType).fromValue(data.resourceType),\n      isCommented: data.isCommented,\n\n      // Properties\n      id: this.toAstProperty(bitType, ConfigKey.property_id, data.id, options),\n      gUri: this.toAstProperty(bitType, ConfigKey.property_gUri, data.gUri, options),\n      internalComment: this.toAstProperty(\n        bitType,\n        ConfigKey.property_internalComment,\n        data.internalComment,\n        options,\n      ),\n      customerId: this.toAstProperty(\n        bitType,\n        ConfigKey.property_customerId,\n        data.customerId,\n        options,\n      ),\n      customerExternalId: this.toAstProperty(\n        bitType,\n        ConfigKey.property_customerExternalId,\n        data.customerExternalId,\n        options,\n      ),\n      externalId: this.toAstProperty(\n        bitType,\n        ConfigKey.property_externalId,\n        data.externalId,\n        options,\n      ),\n      spaceId: this.toAstProperty(bitType, ConfigKey.property_spaceId, data.spaceId, options),\n      padletId: this.toAstProperty(bitType, ConfigKey.property_padletId, data.padletId, options),\n      jupyterId: this.toAstProperty(bitType, ConfigKey.property_jupyterId, data.jupyterId, options),\n      jupyterExecutionCount: this.toAstProperty(\n        bitType,\n        ConfigKey.property_jupyterExecutionCount,\n        data.jupyterExecutionCount,\n        options,\n      ),\n      copyright: this.toAstProperty(bitType, ConfigKey.property_copyright, data.copyright, options),\n      license: this.toAstProperty(bitType, ConfigKey.property_license, data.license, options),\n      rightsPolicy: this.toAstProperty(\n        bitType,\n        ConfigKey.property_rightsPolicy,\n        data.rightsPolicy,\n        options,\n      ),\n      sourceRL: this.toAstProperty(bitType, ConfigKey.property_sourceRL, data.sourceRL, options),\n      isPublic: this.toAstProperty(bitType, ConfigKey.property_isPublic, data.isPublic, options),\n      isTemplate: this.toAstProperty(\n        bitType,\n        ConfigKey.property_isTemplate,\n        data.isTemplate,\n        options,\n      ),\n      isTemplateStripTheme: this.toAstProperty(\n        bitType,\n        ConfigKey.property_isTemplateStripTheme,\n        data.isTemplateStripTheme,\n        options,\n      ),\n      isEditable: this.toAstProperty(\n        bitType,\n        ConfigKey.property_isEditable,\n        data.isEditable,\n        options,\n      ),\n      needsValidation: this.toAstProperty(\n        bitType,\n        ConfigKey.property_needsValidation,\n        data.needsValidation,\n        options,\n      ),\n      validationDate: this.toAstProperty(\n        bitType,\n        ConfigKey.property_validationDate,\n        data.validationDate,\n        options,\n      ),\n      aiGenerated: this.toAstProperty(\n        bitType,\n        ConfigKey.property_aiGenerated,\n        data.aiGenerated,\n        options,\n      ),\n      machineTranslated: this.toAstProperty(\n        bitType,\n        ConfigKey.property_machineTranslated,\n        data.machineTranslated,\n        options,\n      ),\n      translationOf: this.toAstProperty(\n        bitType,\n        ConfigKey.property_translationOf,\n        data.translationOf,\n        options,\n      ),\n      spansPageBreak: this.toAstProperty(\n        bitType,\n        ConfigKey.property_spansPageBreak,\n        data.spansPageBreak,\n        options,\n      ),\n      searchIndex: this.toAstProperty(\n        bitType,\n        ConfigKey.property_searchIndex,\n        data.searchIndex,\n        options,\n      ),\n      analyticsTag: this.toAstProperty(\n        bitType,\n        ConfigKey.property_analyticsTag,\n        data.analyticsTag,\n        options,\n      ),\n      categoryTag: this.toAstProperty(\n        bitType,\n        ConfigKey.property_categoryTag,\n        data.categoryTag,\n        options,\n      ),\n      topicTag: this.toAstProperty(bitType, ConfigKey.property_topicTag, data.topicTag, options),\n      reportTag: this.toAstProperty(bitType, ConfigKey.property_reportTag, data.reportTag, options),\n      altLangTag: this.toAstProperty(\n        bitType,\n        ConfigKey.property_altLangTag,\n        data.altLangTag,\n        options,\n      ),\n      feedbackEngine: this.toAstProperty(\n        bitType,\n        ConfigKey.property_feedbackEngine,\n        data.feedbackEngine,\n        options,\n      ),\n      feedbackType: this.toAstProperty(\n        bitType,\n        ConfigKey.property_feedbackType,\n        data.feedbackType,\n        options,\n      ),\n      disableFeedback: this.toAstProperty(\n        bitType,\n        ConfigKey.property_disableFeedback,\n        data.disableFeedback,\n        options,\n      ),\n      diffTo: this.toAstProperty(bitType, ConfigKey.property_diffTo, data.diffTo, options),\n      diffOp: this.toAstProperty(bitType, ConfigKey.property_diffOp, data.diffOp, options),\n      diffRef: this.toAstProperty(bitType, ConfigKey.property_diffRef, data.diffRef, options),\n      diffContext: this.toAstProperty(\n        bitType,\n        ConfigKey.property_diffContext,\n        data.diffContext,\n        options,\n      ),\n      diffTime: this.toAstProperty(bitType, ConfigKey.property_diffTime, data.diffTime, options),\n      path: this.toAstProperty(bitType, ConfigKey.property_path, data.path, options),\n      releaseVersion: this.toAstProperty(\n        bitType,\n        ConfigKey.property_releaseVersion,\n        data.releaseVersion,\n        options,\n      ),\n      releaseKind: this.toAstProperty(\n        bitType,\n        ConfigKey.property_releaseKind,\n        data.releaseKind,\n        options,\n      ),\n      releaseDate: this.toAstProperty(\n        bitType,\n        ConfigKey.property_releaseDate,\n        data.releaseDate,\n        options,\n      ),\n      iframeSrc: this.toAstProperty(bitType, ConfigKey.property_iframeSrc, data.iframeSrc, options),\n      iframeName: this.toAstProperty(\n        bitType,\n        ConfigKey.property_iframeName,\n        data.iframeName,\n        options,\n      ),\n      book: this.buildBooks(context, data.book),\n      ageRange: this.toAstProperty(bitType, ConfigKey.property_ageRange, data.ageRange, options),\n      lang: this.toAstProperty(bitType, ConfigKey.property_lang, data.lang, options),\n      language: this.toAstProperty(bitType, ConfigKey.property_language, data.language, options),\n      publisher: this.toAstProperty(bitType, ConfigKey.property_publisher, data.publisher, options),\n      publisherName: this.toAstProperty(\n        bitType,\n        ConfigKey.property_publisherName,\n        data.publisherName,\n        options,\n      ),\n      displayName: this.toAstProperty(\n        bitType,\n        ConfigKey.property_displayName,\n        data.displayName,\n        options,\n      ),\n      theme: this.toAstProperty(bitType, ConfigKey.property_theme, data.theme, options),\n      rtl: this.toAstProperty(bitType, ConfigKey.property_rtl, data.rtl, options),\n      computerLanguage: this.toAstProperty(\n        bitType,\n        ConfigKey.property_computerLanguage,\n        data.computerLanguage,\n        options,\n      ),\n      target: this.toAstProperty(bitType, ConfigKey.property_target, data.target, options),\n      slug: this.toAstProperty(bitType, ConfigKey.property_slug, data.slug, options),\n      tag: this.toAstProperty(bitType, ConfigKey.property_tag, data.tag, options),\n      groupTag: this.buildGroupTags(context, data.groupTag),\n      reviewTag: this.toAstProperty(bitType, ConfigKey.property_reviewTag, data.reviewTag, options),\n      reviewerTag: this.toAstProperty(\n        bitType,\n        ConfigKey.property_reviewerTag,\n        data.reviewerTag,\n        options,\n      ),\n      reductionTag: this.toAstProperty(\n        bitType,\n        ConfigKey.property_reductionTag,\n        data.reductionTag,\n        options,\n      ),\n      bubbleTag: this.toAstProperty(bitType, ConfigKey.property_bubbleTag, data.bubbleTag, options),\n      extractorTag: this.toAstProperty(\n        bitType,\n        ConfigKey.property_extractorTag,\n        data.extractorTag,\n        options,\n      ),\n      extractorInternal: this.toAstProperty(\n        bitType,\n        ConfigKey.property_extractorInternal,\n        data.extractorInternal,\n        options,\n      ),\n      sourceBB: this.normaliseSourceBB(data.sourceBB),\n      bitFingerprint: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bitFingerprint,\n        data.bitFingerprint,\n        options,\n      ),\n      levelCEFRp: this.toAstProperty(\n        bitType,\n        ConfigKey.property_levelCEFRp,\n        data.levelCEFRp,\n        options,\n      ),\n      levelCEFR: this.toAstProperty(bitType, ConfigKey.property_levelCEFR, data.levelCEFR, options),\n      levelILR: this.toAstProperty(bitType, ConfigKey.property_levelILR, data.levelILR, options),\n      levelACTFL: this.toAstProperty(\n        bitType,\n        ConfigKey.property_levelACTFL,\n        data.levelACTFL,\n        options,\n      ),\n      icon: this.toAstProperty(bitType, ConfigKey.property_icon, data.icon, options),\n      iconTag: this.toAstProperty(bitType, ConfigKey.property_iconTag, data.iconTag, options),\n      colorTag: this.toAstProperty(bitType, ConfigKey.property_colorTag, data.colorTag, options),\n      flashcardSet: this.toAstProperty(\n        bitType,\n        ConfigKey.property_flashcardSet,\n        data.flashcardSet,\n        options,\n      ),\n      subtype: this.toAstProperty(bitType, ConfigKey.property_subtype, data.subtype, options),\n      bookAlias: this.toAstProperty(bitType, ConfigKey.property_bookAlias, data.bookAlias, options),\n      bookDiff: this.toAstProperty(bitType, ConfigKey.property_bookDiff, data.bookDiff, options),\n      coverImage:\n        typeof data.coverImage === 'string' || Array.isArray(data.coverImage)\n          ? this.toAstProperty(\n              bitType,\n              ConfigKey.property_coverImage,\n              ArrayUtils.asArray(data.coverImage),\n              options,\n            )\n          : this.toImageResource(context, data.coverImage),\n      coverColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_coverColor,\n        data.coverColor,\n        options,\n      ),\n      backgroundImage:\n        typeof data.backgroundImage === 'string' || Array.isArray(data.backgroundImage)\n          ? this.toAstProperty(\n              bitType,\n              ConfigKey.property_backgroundImage,\n              ArrayUtils.asArray(data.backgroundImage),\n              options,\n            )\n          : this.toImageResource(context, data.backgroundImage),\n      publications: this.toAstProperty(\n        bitType,\n        ConfigKey.property_publications,\n        data.publications,\n        options,\n      ),\n      relatedBook: this.toAstProperty(\n        bitType,\n        ConfigKey.property_relatedBook,\n        data.relatedBook,\n        options,\n      ),\n      translationOfBook: this.toAstProperty(\n        bitType,\n        ConfigKey.property_translationOfBook,\n        data.translationOfBook,\n        options,\n      ),\n      userFeedbackTranslationUrl: this.toAstProperty(\n        bitType,\n        ConfigKey.property_userFeedbackTranslationUrl,\n        data.userFeedbackTranslationUrl,\n        options,\n      ),\n      userFeedbackContentUrl: this.toAstProperty(\n        bitType,\n        ConfigKey.property_userFeedbackContentUrl,\n        data.userFeedbackContentUrl,\n        options,\n      ),\n      author: this.toAstProperty(bitType, ConfigKey.property_author, data.author, options),\n      subject: this.toAstProperty(bitType, ConfigKey.property_subject, data.subject, options),\n      date: this.toAstProperty(bitType, ConfigKey.property_date, data.date, options),\n      dateEnd: this.toAstProperty(bitType, ConfigKey.property_dateEnd, data.dateEnd, options),\n      location: this.toAstProperty(bitType, ConfigKey.property_location, data.location, options),\n      kind: this.toAstProperty(bitType, ConfigKey.property_kind, data.kind, options),\n      hasMarkAsDone: this.toAstProperty(\n        bitType,\n        ConfigKey.property_hasMarkAsDone,\n        data.hasMarkAsDone,\n        options,\n      ),\n      processHandIn: this.toAstProperty(\n        bitType,\n        ConfigKey.property_processHandIn,\n        data.processHandIn,\n        options,\n      ),\n      processHandInLocation: this.toAstProperty(\n        bitType,\n        ConfigKey.property_processHandInLocation,\n        data.processHandInLocation,\n        options,\n      ),\n      chatWithBook: this.toAstProperty(\n        bitType,\n        ConfigKey.property_chatWithBook,\n        data.chatWithBook,\n        options,\n      ),\n      chatWithBookBrainKey: this.toAstProperty(\n        bitType,\n        ConfigKey.property_chatWithBookBrainKey,\n        data.chatWithBookBrainKey,\n        options,\n      ),\n      currency: this.toAstProperty(bitType, ConfigKey.property_currency, data.currency, options),\n      bookIsbn: this.toAstProperty(bitType, ConfigKey.property_bookIsbn, data.bookIsbn, options),\n      bookAuthor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bookAuthor,\n        data.bookAuthor,\n        options,\n      ),\n      bookType: this.toAstProperty(bitType, ConfigKey.property_bookType, data.bookType, options),\n      bookBindingType: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bookBindingType,\n        data.bookBindingType,\n        options,\n      ),\n      bookNumberOfPages: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bookNumberOfPages,\n        data.bookNumberOfPages,\n        options,\n      ),\n      bookRating: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bookRating,\n        data.bookRating,\n        options,\n      ),\n      bookSeriesTitle: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bookSeriesTitle,\n        data.bookSeriesTitle,\n        options,\n      ),\n      bookSeriesId: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bookSeriesId,\n        data.bookSeriesId,\n        options,\n      ),\n      bookSeriesNumber: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bookSeriesNumber,\n        data.bookSeriesNumber,\n        options,\n      ),\n      bookLanguage: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bookLanguage,\n        data.bookLanguage,\n        options,\n      ),\n      bookPublishingDate: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bookPublishingDate,\n        data.bookPublishingDate,\n        options,\n      ),\n      bookPublisher: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bookPublisher,\n        data.bookPublisher,\n        options,\n      ),\n      bookTranslator: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bookTranslator,\n        data.bookTranslator,\n        options,\n      ),\n      bookOriginalTitle: this.toAstProperty(\n        bitType,\n        ConfigKey.property_bookOriginalTitle,\n        data.bookOriginalTitle,\n        options,\n      ),\n      gmbExternalShop: this.toAstProperty(\n        bitType,\n        ConfigKey.property_gmbExternalShop,\n        data.gmbExternalShop,\n        options,\n      ),\n      gmbExternalShopItems: this.toAstProperty(\n        bitType,\n        ConfigKey.property_gmbExternalShopItems,\n        data.gmbExternalShopItems,\n        options,\n      ),\n      action: this.toAstProperty(bitType, ConfigKey.property_action, data.action, options),\n      showInIndex: this.toAstProperty(\n        bitType,\n        ConfigKey.property_showInIndex,\n        data.showInIndex,\n        options,\n      ),\n      refAuthor: this.toAstProperty(bitType, ConfigKey.property_refAuthor, data.refAuthor, options),\n      refBookTitle: this.toAstProperty(\n        bitType,\n        ConfigKey.property_refBookTitle,\n        data.refBookTitle,\n        options,\n      ),\n      refPublisher: this.toAstProperty(\n        bitType,\n        ConfigKey.property_refPublisher,\n        data.refPublisher,\n        options,\n      ),\n      refPublicationYear: this.toAstProperty(\n        bitType,\n        ConfigKey.property_refPublicationYear,\n        data.refPublicationYear,\n        options,\n      ),\n      citationStyle: this.toAstProperty(\n        bitType,\n        ConfigKey.property_citationStyle,\n        data.citationStyle,\n        options,\n      ),\n      blockId: this.toAstProperty(bitType, ConfigKey.property_blockId, data.blockId, options),\n      pageNo: this.toAstProperty(bitType, ConfigKey.property_pageNo, data.pageNo, options),\n      x: this.toAstProperty(bitType, ConfigKey.property_x, data.x, options),\n      y: this.toAstProperty(bitType, ConfigKey.property_y, data.y, options),\n      width: this.toAstProperty(bitType, ConfigKey.property_width, data.width, options),\n      height: this.toAstProperty(bitType, ConfigKey.property_height, data.height, options),\n      index: this.toAstProperty(bitType, ConfigKey.property_index, data.index, options),\n      classification: this.toAstProperty(\n        bitType,\n        ConfigKey.property_classification,\n        data.classification,\n        options,\n      ),\n      availableClassifications: this.toAstProperty(\n        bitType,\n        ConfigKey.property_availableClassifications,\n        data.availableClassifications,\n        options,\n      ),\n      allowedBit: this.toAstProperty(\n        bitType,\n        ConfigKey.property_allowedBit,\n        data.allowedBit,\n        options,\n      ),\n      authorFullName: this.toAstProperty(\n        bitType,\n        ConfigKey.property_authorFullName,\n        data.authorFullName,\n        options,\n      ),\n      authorPseudonym: this.toAstProperty(\n        bitType,\n        ConfigKey.property_authorPseudonym,\n        data.authorPseudonym,\n        options,\n      ),\n      authorTitle: this.toAstProperty(\n        bitType,\n        ConfigKey.property_authorTitle,\n        data.authorTitle,\n        options,\n      ),\n      authorJobTitle: this.toAstProperty(\n        bitType,\n        ConfigKey.property_authorJobTitle,\n        data.authorJobTitle,\n        options,\n      ),\n      tableFixedHeader: this.toAstProperty(\n        bitType,\n        ConfigKey.property_tableFixedHeader,\n        data.tableFixedHeader,\n        options,\n      ),\n      tableHeaderWhitespaceNoWrap: this.toAstProperty(\n        bitType,\n        ConfigKey.property_tableHeaderWhitespaceNoWrap,\n        data.tableHeaderWhitespaceNoWrap,\n        options,\n      ),\n      tableSearch: this.toAstProperty(\n        bitType,\n        ConfigKey.property_tableSearch,\n        data.tableSearch,\n        options,\n      ),\n      tableSort: this.toAstProperty(bitType, ConfigKey.property_tableSort, data.tableSort, options),\n      tablePagination: this.toAstProperty(\n        bitType,\n        ConfigKey.property_tablePagination,\n        data.tablePagination,\n        options,\n      ),\n      tablePaginationLimit: this.toAstProperty(\n        bitType,\n        ConfigKey.property_tablePaginationLimit,\n        data.tablePaginationLimit,\n        options,\n      ),\n      tableHeight: this.toAstProperty(\n        bitType,\n        ConfigKey.property_tableHeight,\n        data.tableHeight,\n        options,\n      ),\n      tableWhitespaceNoWrap: this.toAstProperty(\n        bitType,\n        ConfigKey.property_tableWhitespaceNoWrap,\n        data.tableWhitespaceNoWrap,\n        options,\n      ),\n      tableAutoWidth: this.toAstProperty(\n        bitType,\n        ConfigKey.property_tableAutoWidth,\n        data.tableAutoWidth,\n        options,\n      ),\n      tableResizableColumns: this.toAstProperty(\n        bitType,\n        ConfigKey.property_tableResizableColumns,\n        data.tableResizableColumns,\n        options,\n      ),\n      tableColumnMinWidth: this.toAstProperty(\n        bitType,\n        ConfigKey.property_tableColumnMinWidth,\n        data.tableColumnMinWidth,\n        options,\n      ),\n      quizCountItems: this.toAstProperty(\n        bitType,\n        ConfigKey.property_quizCountItems,\n        data.quizCountItems,\n        options,\n      ),\n      quizStrikethroughSolutions: this.toAstProperty(\n        bitType,\n        ConfigKey.property_quizStrikethroughSolutions,\n        data.quizStrikethroughSolutions,\n        options,\n      ),\n      codeLineNumbers: this.toAstProperty(\n        bitType,\n        ConfigKey.property_codeLineNumbers,\n        data.codeLineNumbers,\n        options,\n      ),\n      codeMinimap: this.toAstProperty(\n        bitType,\n        ConfigKey.property_codeMinimap,\n        data.codeMinimap,\n        options,\n      ),\n      stripePricingTableId: this.toAstProperty(\n        bitType,\n        ConfigKey.property_stripePricingTableId,\n        data.stripePricingTableId,\n        options,\n      ),\n      stripePricingTableDescriptiveName: this.toAstProperty(\n        bitType,\n        ConfigKey.property_stripePricingTableDescriptiveName,\n        data.stripePricingTableDescriptiveName,\n        options,\n      ),\n      stripePublishableKey: this.toAstProperty(\n        bitType,\n        ConfigKey.property_stripePublishableKey,\n        data.stripePublishableKey,\n        options,\n      ),\n      thumbImage: this.toAstProperty(\n        bitType,\n        ConfigKey.property_thumbImage,\n        data.thumbImage,\n        options,\n      ),\n      scormSource: this.toAstProperty(\n        bitType,\n        ConfigKey.property_scormSource,\n        data.scormSource,\n        options,\n      ),\n      posterImage: this.toAstProperty(\n        bitType,\n        ConfigKey.property_posterImage,\n        data.posterImage,\n        options,\n      ),\n      focusX: this.toAstProperty(bitType, ConfigKey.property_focusX, data.focusX, options),\n      focusY: this.toAstProperty(bitType, ConfigKey.property_focusY, data.focusY, options),\n      pointerLeft: this.toAstProperty(\n        bitType,\n        ConfigKey.property_pointerLeft,\n        data.pointerLeft,\n        options,\n      ),\n      pointerTop: this.toAstProperty(\n        bitType,\n        ConfigKey.property_pointerTop,\n        data.pointerTop,\n        options,\n      ),\n      listItemIndent: this.toAstProperty(\n        bitType,\n        ConfigKey.property_listItemIndent,\n        data.listItemIndent,\n        options,\n      ),\n      backgroundWallpaper: this.toImageResource(context, data.backgroundWallpaper),\n      hasBookNavigation: this.toAstProperty(\n        bitType,\n        ConfigKey.property_hasBookNavigation,\n        data.hasBookNavigation,\n        options,\n      ),\n      duration: this.toAstProperty(bitType, ConfigKey.property_duration, data.duration, options),\n      deeplink: this.toAstProperty(bitType, ConfigKey.property_deeplink, data.deeplink, options),\n      externalLink: this.toAstProperty(\n        bitType,\n        ConfigKey.property_externalLink,\n        data.externalLink,\n        options,\n      ),\n      externalLinkText: this.toAstProperty(\n        bitType,\n        ConfigKey.property_externalLinkText,\n        data.externalLinkText,\n        options,\n      ),\n      videoCallLink: this.toAstProperty(\n        bitType,\n        ConfigKey.property_videoCallLink,\n        data.videoCallLink,\n        options,\n      ),\n      vendorDashboardId: this.toAstProperty(\n        bitType,\n        ConfigKey.property_vendorDashboardId,\n        data.vendorDashboardId,\n        options,\n      ),\n      vendorSurveyId: this.toAstProperty(\n        bitType,\n        ConfigKey.property_vendorSurveyId,\n        data.vendorSurveyId,\n        options,\n      ),\n      vendorUrl: this.toAstProperty(bitType, ConfigKey.property_vendorUrl, data.vendorUrl, options),\n      search: this.toAstProperty(bitType, ConfigKey.property_search, data.search, options),\n      list: this.toAstProperty(bitType, ConfigKey.property_list, data.list, options),\n      layer: this.toAstProperty(bitType, ConfigKey.property_layer, data.layer, options),\n      layerRole: this.toAstProperty(bitType, ConfigKey.property_layerRole, data.layerRole, options),\n      textReference: this.toAstProperty(\n        bitType,\n        ConfigKey.property_textReference,\n        data.textReference,\n        options,\n      ),\n      isTracked: this.toAstProperty(bitType, ConfigKey.property_isTracked, data.isTracked, options),\n      isInfoOnly: this.toAstProperty(\n        bitType,\n        ConfigKey.property_isInfoOnly,\n        data.isInfoOnly,\n        options,\n      ),\n      imageFirst: this.toAstProperty(\n        bitType,\n        ConfigKey.property_imageFirst,\n        data.imageFirst,\n        options,\n      ),\n      activityType: this.toAstProperty(\n        bitType,\n        ConfigKey.property_activityType,\n        data.activityType,\n        options,\n      ),\n      labelTrue: this.toAstProperty(bitType, ConfigKey.property_labelTrue, data.labelTrue, options),\n      labelFalse: this.toAstProperty(\n        bitType,\n        ConfigKey.property_labelFalse,\n        data.labelFalse,\n        options,\n      ),\n      content2Buy: this.toAstProperty(\n        bitType,\n        ConfigKey.property_content2Buy,\n        data.content2Buy,\n        options,\n      ),\n      listPrice: this.toAstProperty(bitType, ConfigKey.property_listPrice, data.listPrice, options),\n      customerProductId: this.toAstProperty(\n        bitType,\n        ConfigKey.property_customerProductId,\n        data.customerProductId,\n        options,\n      ),\n      customerProductShopLink: this.toAstProperty(\n        bitType,\n        ConfigKey.property_customerProductShopLink,\n        data.customerProductShopLink,\n        options,\n      ),\n      mailingList: this.toAstProperty(\n        bitType,\n        ConfigKey.property_mailingList,\n        data.mailingList,\n        options,\n      ),\n      buttonCaption: this.toAstProperty(\n        bitType,\n        ConfigKey.property_buttonCaption,\n        data.buttonCaption,\n        options,\n      ),\n      callToActionUrl: this.toAstProperty(\n        bitType,\n        ConfigKey.property_callToActionUrl,\n        data.callToActionUrl,\n        options,\n      ),\n      advertisingClickUrl: this.toAstProperty(\n        bitType,\n        ConfigKey.property_advertisingClickUrl,\n        data.advertisingClickUrl,\n        options,\n      ),\n      brandColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_brandColor,\n        data.brandColor,\n        options,\n      ),\n      brandColorName: this.toAstProperty(\n        bitType,\n        ConfigKey.property_brandColorName,\n        data.brandColorName,\n        options,\n      ),\n      caption: this.handleJsonText(context, TextLocation.tag, data.caption),\n      quotedPerson: this.toAstProperty(\n        bitType,\n        ConfigKey.property_quotedPerson,\n        data.quotedPerson,\n        options,\n      ),\n      reasonableNumOfChars: reasonableNumOfCharsProperty,\n      resolved: this.toAstProperty(bitType, ConfigKey.property_resolved, data.resolved, options),\n      resolvedDate: this.toAstProperty(\n        bitType,\n        ConfigKey.property_resolvedDate,\n        data.resolvedDate,\n        options,\n      ),\n      resolvedBy: this.toAstProperty(\n        bitType,\n        ConfigKey.property_resolvedBy,\n        data.resolvedBy,\n        options,\n      ),\n      handInAcceptFileType: this.toAstProperty(\n        bitType,\n        ConfigKey.property_handInAcceptFileType,\n        data.handInAcceptFileType,\n        options,\n      ),\n      handInRequirement: this.toAstProperty(\n        bitType,\n        ConfigKey.property_handInRequirement,\n        data.handInRequirement,\n        options,\n      ),\n      handInInstruction: this.toAstProperty(\n        bitType,\n        ConfigKey.property_handInInstruction,\n        data.handInInstruction,\n        options,\n      ),\n      maxCreatedBits: this.toAstProperty(\n        bitType,\n        ConfigKey.property_maxCreatedBits,\n        data.maxCreatedBits,\n        options,\n      ),\n      maxDisplayLevel: this.toAstProperty(\n        bitType,\n        ConfigKey.property_maxDisplayLevel,\n        data.maxDisplayLevel,\n        options,\n      ),\n      maxTocChapterLevel: this.toAstProperty(\n        bitType,\n        ConfigKey.property_maxTocChapterLevel,\n        data.maxTocChapterLevel,\n        options,\n      ),\n      sourceDocument: this.toAstProperty(\n        bitType,\n        ConfigKey.property_sourceDocument,\n        data.sourceDocument,\n        options,\n      ),\n      internalPrintPdf: this.toAstProperty(\n        bitType,\n        ConfigKey.property_internalPrintPdf,\n        data.internalPrintPdf,\n        options,\n      ),\n      hasPrintRestriction: this.toAstProperty(\n        bitType,\n        ConfigKey.property_hasPrintRestriction,\n        data.hasPrintRestriction,\n        options,\n      ),\n      enforceUpdateOverUserInput: this.toAstProperty(\n        bitType,\n        ConfigKey.property_enforceUpdateOverUserInput,\n        data.enforceUpdateOverUserInput,\n        options,\n      ),\n      extractorExtractionTimestamp: this.toAstProperty(\n        bitType,\n        ConfigKey.property_extractorExtractionTimestamp,\n        data.extractorExtractionTimestamp,\n        options,\n      ),\n      tocResource: this.toAstProperty(\n        bitType,\n        ConfigKey.property_tocResource,\n        data.tocResource,\n        options,\n      ),\n      tocContent: this.toAstProperty(\n        bitType,\n        ConfigKey.property_tocContent,\n        data.tocContent,\n        options,\n      ),\n      page: this.toAstProperty(bitType, ConfigKey.property_page, data.page, options),\n      allowPrint: this.toAstProperty(\n        bitType,\n        ConfigKey.property_allowPrint,\n        data.allowPrint,\n        options,\n      ),\n      printParentChapterLevel: this.toAstProperty(\n        bitType,\n        ConfigKey.property_printParentChapterLevel,\n        data.printParentChapterLevel,\n        options,\n      ),\n      printOnRequestCustomerId: this.toAstProperty(\n        bitType,\n        ConfigKey.property_printOnRequestCustomerId,\n        data.printOnRequestCustomerId,\n        options,\n      ),\n      printOnRequestProductId: this.toAstProperty(\n        bitType,\n        ConfigKey.property_printOnRequestProductId,\n        data.printOnRequestProductId,\n        options,\n      ),\n      platformBrandTarget: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformBrandTarget,\n        data.platformBrandTarget,\n        options,\n      ),\n      platformName: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformName,\n        data.platformName,\n        options,\n      ),\n      platformIcon: this.toImageResource(context, data.platformIcon),\n      platformLogo: this.toImageResource(context, data.platformLogo),\n      platformLogoMaxHeight: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformLogoMaxHeight,\n        data.platformLogoMaxHeight,\n        options,\n      ),\n      platformPrimaryColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformPrimaryColor,\n        data.platformPrimaryColor,\n        options,\n      ),\n      platformSecondaryColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformSecondaryColor,\n        data.platformSecondaryColor,\n        options,\n      ),\n      platformBackgroundColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformBackgroundColor,\n        data.platformBackgroundColor,\n        options,\n      ),\n      platformScrollbarColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformScrollbarColor,\n        data.platformScrollbarColor,\n        options,\n      ),\n      platformSelectionColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformSelectionColor,\n        data.platformSelectionColor,\n        options,\n      ),\n      platformSeparatorColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformSeparatorColor,\n        data.platformSeparatorColor,\n        options,\n      ),\n      platformPlaceholderColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformPlaceholderColor,\n        data.platformPlaceholderColor,\n        options,\n      ),\n      platformTextSelectionColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformTextSelectionColor,\n        data.platformTextSelectionColor,\n        options,\n      ),\n      platformButtonPrimaryColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformButtonPrimaryColor,\n        data.platformButtonPrimaryColor,\n        options,\n      ),\n      platformButtonBackgroundColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformButtonBackgroundColor,\n        data.platformButtonBackgroundColor,\n        options,\n      ),\n      platformMessageBackgroundColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformMessageBackgroundColor,\n        data.platformMessageBackgroundColor,\n        options,\n      ),\n      platformBackgroundImage: this.toImageResource(context, data.platformBackgroundImage),\n      platformBorderColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformBorderColor,\n        data.platformBorderColor,\n        options,\n      ),\n      platformSelectionTextColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformSelectionTextColor,\n        data.platformSelectionTextColor,\n        options,\n      ),\n      platformBaseLayerColor: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformBaseLayerColor,\n        data.platformBaseLayerColor,\n        options,\n      ),\n      platformMargin: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformMargin,\n        data.platformMargin,\n        options,\n      ),\n      platformBorderRadius: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformBorderRadius,\n        data.platformBorderRadius,\n        options,\n      ),\n      platformSelectionBorderRadius: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformSelectionBorderRadius,\n        data.platformSelectionBorderRadius,\n        options,\n      ),\n      platformNeedsShadow: this.toAstProperty(\n        bitType,\n        ConfigKey.property_platformNeedsShadow,\n        data.platformNeedsShadow,\n        options,\n      ),\n      productId: this.toAstProperty(bitType, ConfigKey.property_productId, data.productId, options),\n      product: this.toAstProperty(bitType, ConfigKey.property_product, data.product, options),\n      // productList: this.toAstProperty(\n      //   bitType,\n      //   ConfigKey.property_productList,\n      //   data.productList,\n      //   options,\n      // ),\n      productVideo: this.toAstProperty(\n        bitType,\n        ConfigKey.property_productVideo,\n        data.productVideo,\n        options,\n      ),\n      // productVideoList: this.toAstProperty(\n      //   bitType,\n      //   ConfigKey.property_productVideoList,\n      //   data.productVideoList,\n      //   options,\n      // ),\n      productFolder: this.toAstProperty(\n        bitType,\n        ConfigKey.property_productFolder,\n        data.productFolder,\n        options,\n      ),\n      technicalTerm: this.buildTechnicalTerm(context, data.technicalTerm),\n      servings: this.buildServings(context, data.servings),\n      ratingLevelStart: this.buildRatingLevelStartEnd(context, data.ratingLevelStart),\n      ratingLevelEnd: this.buildRatingLevelStartEnd(context, data.ratingLevelEnd),\n      ratingLevelSelected: this.toAstProperty(\n        bitType,\n        ConfigKey.property_ratingLevelSelected,\n        data.ratingLevelSelected,\n        options,\n      ),\n      formula: this.toAstProperty(bitType, ConfigKey.property_formula, data.formula, options),\n      markConfig: this.buildMarkConfigs(context, data.markConfig),\n      imageSource: this.buildImageSource(context, data.imageSource),\n      person: this.buildPerson(context, data.person),\n      bot: this.toAstProperty(bitType, ConfigKey.property_bot, data.bot, options),\n      referenceProperty: this.toAstProperty(\n        bitType,\n        ConfigKey.property_reference,\n        data.referenceProperty,\n        options,\n      ),\n\n      // Author data\n      fullName: this.toAstProperty(bitType, ConfigKey.property_fullName, data.fullName, options),\n      pseudonym: this.toAstProperty(bitType, ConfigKey.property_pseudonym, data.pseudonym, options),\n      titleString: this.toAstProperty(bitType, ConfigKey.property_title, data.titleString, options),\n      jobTitle: this.toAstProperty(bitType, ConfigKey.property_jobTitle, data.jobTitle, options),\n\n      // Book data\n      title: this.handleJsonText(context, TextLocation.tag, data.title),\n      subtitle: this.handleJsonText(context, TextLocation.tag, data.subtitle),\n      level: NumberUtils.asNumber(data.level),\n      toc: this.toAstProperty(bitType, ConfigKey.property_toc, data.toc, options),\n      progress: this.toAstProperty(bitType, ConfigKey.property_progress, data.progress, options),\n      isCollapsible: this.toAstProperty(\n        bitType,\n        ConfigKey.property_isCollapsible,\n        data.isCollapsible ?? (isCollapsibleDefaultsTrue ? true : undefined),\n        options,\n      ),\n      anchor: data.anchor,\n      reference: data.reference,\n      referenceEnd: data.referenceEnd,\n      revealSolutions: this.toAstProperty(\n        bitType,\n        ConfigKey.property_revealSolutions,\n        data.revealSolutions,\n        options,\n      ),\n\n      // Item, Lead, Hint, Instruction\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      pageNumber: this.handleJsonText(context, TextLocation.tag, data.pageNumber),\n      marginNumber: this.handleJsonText(context, TextLocation.tag, data.marginNumber),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n\n      partialAnswer: this.toAstProperty(\n        bitType,\n        ConfigKey.property_partialAnswer,\n        data.partialAnswer,\n        options,\n      ),\n      sampleSolution: this.toAstProperty(\n        bitType,\n        ConfigKey.property_sampleSolution,\n        data.sampleSolution,\n        options,\n      ),\n      additionalSolutions: this.toAstProperty(\n        bitType,\n        ConfigKey.property_additionalSolutions,\n        data.additionalSolutions,\n        options,\n      ),\n\n      // Example\n      ...this.toExample(data.__isDefaultExample, data.example as TextAst),\n\n      // Person\n\n      previewImage: this.toImageResources(context, data.previewImage),\n      previewVideo: this.toVideoResources(context, data.previewVideo),\n      imagePlaceholder: this.toImageResource(context, data.imagePlaceholder),\n      resources: ArrayUtils.asArray(\n        this.resourceBuilder.resourceFromResourceJson(context, data.resources),\n      ),\n\n      // Body, Card, Footer, must be after all other properties except the extraProperties and markup / parser\n      body: this.buildBody(context, data.body),\n      cardNode,\n      footer: this.buildFooter(context, data.footer),\n\n      // Must be after other properties/tags in the AST so key clashes are avoided correctly\n      extraProperties: this.parseExtraProperties(data.extraProperties),\n\n      markup: data.markup,\n      parser: data.parser,\n\n      // Private properties\n      __isDefaultExample: data.__isDefaultExample ?? false,\n    };\n\n    // Push reasonableNumOfChars down the tree for the interview bits\n    if (Config.isOfBitType(node.bitType, BitType.interview)) {\n      this.pushDownTree(\n        context,\n        undefined,\n        undefined,\n        cardNode,\n        'questions',\n        'reasonableNumOfChars',\n        data.reasonableNumOfChars,\n      );\n    }\n\n    // Push reasonableNumOfChars down the tree for the feedback bits\n    if (Config.isOfBitType(node.bitType, BitType.feedback)) {\n      this.pushDownTree(\n        context,\n        undefined,\n        undefined,\n        cardNode,\n        ['feedbacks', 'reason'],\n        'reasonableNumOfChars',\n        data.reasonableNumOfChars,\n      );\n    }\n\n    // Push isCaseSensitive down the tree for the cloze, match and match-matrix bits\n    this.pushDownTree(\n      context,\n      [node.body, ...(cardNode?.cardBits?.map((cardBit) => cardBit.body) || [])],\n      [BodyBitType.gap],\n      undefined,\n      undefined, //'isCaseSensitive',\n      'isCaseSensitive',\n      data.isCaseSensitive ?? true,\n    );\n\n    this.pushDownTree(\n      context,\n      undefined,\n      undefined,\n      cardNode,\n      'pairs',\n      'isCaseSensitive',\n      data.isCaseSensitive ?? true,\n    );\n    this.pushDownTree(\n      context,\n      undefined,\n      undefined,\n      cardNode,\n      ['matrix', 'cells'],\n      'isCaseSensitive',\n      data.isCaseSensitive ?? true,\n    );\n\n    // If __isDefaultExample is set at the bit level, push the default example down the tree to the relevant nodes\n    this.pushExampleDownTree(\n      context,\n      node.body,\n      cardNode,\n      node.__isDefaultExample,\n      convertedExample.example,\n    );\n\n    // Set default values\n    this.setDefaultBitValues(node);\n\n    // Set the 'isExample' flags\n    this.setIsExampleFlags(node);\n\n    // Add the version to the parser info\n    this.addVersionToParserInfo(node);\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreUndefined: ['example'],\n      ignoreEmptyArrays: ['item', 'lead', 'pageNumber', 'marginNumber', 'hint', 'instruction'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateBit(node);\n  }\n\n  /**\n   * Build books[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildBooks(\n    context: BuildContext,\n    data: Partial<BookJson>[] | string | undefined,\n  ): BookJson[] | string | undefined {\n    if (StringUtils.isString(data)) return data as string;\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildBook(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build choice node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildBook(\n    _context: BuildContext,\n    data: Partial<BookJson> | undefined,\n  ): BookJson | undefined {\n    if (!data) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: BookJson = {\n      book: data.book ?? '',\n      reference: data.reference ?? '',\n      referenceEnd: (data.referenceEnd ?? undefined) as string,\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyString: ['book', 'reference'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build groupTag[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildGroupTags(\n    context: BuildContext,\n    data: Partial<GroupTagJson> | Partial<GroupTagJson>[] | undefined,\n  ): GroupTagJson[] | undefined {\n    if (!data) return undefined;\n    if (!Array.isArray(data)) data = [data];\n    let nodes = data.map((d) => this.buildGroupTag(context, d)).filter((d) => d != null);\n\n    // Combine tags with the same name, filtering out duplicate tags\n    const combinedNodes: Record<string, GroupTagJson> = {};\n    for (const node of nodes) {\n      if (!node) continue;\n      if (!combinedNodes[node.name]) {\n        combinedNodes[node.name] = node;\n      } else {\n        combinedNodes[node.name].tags = ArrayUtils.removeDuplicates([\n          ...combinedNodes[node.name].tags,\n          ...node.tags,\n        ]);\n      }\n    }\n\n    nodes = Object.values(combinedNodes);\n\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Normalise a sourceBB input into the AST shape (always number[][]).\n   * Accepts a single 4-number tuple or an array of tuples; returns undefined when empty.\n   */\n  protected normaliseSourceBB(data: number[] | number[][] | undefined): number[][] | undefined {\n    if (data == null) return undefined;\n    if (!Array.isArray(data) || data.length === 0) return undefined;\n    // Use some() rather than data[0] so an invalid (undefined) first element doesn't\n    // mask valid nested tuples that follow it.\n    const isNested = (data as unknown[]).some(Array.isArray);\n    const tuples = (isNested ? (data as number[][]) : [data as number[]]).filter(\n      (t) => Array.isArray(t) && t.length === 4 && t.every((n) => typeof n === 'number'),\n    );\n    return tuples.length > 0 ? tuples : undefined;\n  }\n\n  /**\n   * Build groupTag node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildGroupTag(\n    _context: BuildContext,\n    data: Partial<GroupTagJson> | undefined,\n  ): GroupTagJson | undefined {\n    if (!data) return undefined;\n\n    const tags: string[] = Array.isArray(data.tags) ? data.tags : [];\n\n    // NOTE: Node order is important and is defined here\n    const node: GroupTagJson = {\n      name: data.name ?? '',\n      tags: tags.map((tag) => tag?.trim() ?? '') ?? [],\n    };\n\n    // Remove Unset Optionals\n    // ObjectUtils.removeUnwantedProperties(node, {\n    //   ignoreAllFalse: true,\n    //   ignoreEmptyString: ['book', 'reference'],\n    // });\n\n    return node;\n  }\n\n  /**\n   * Build feedbackChoices[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildFeedbackChoices(\n    context: BuildContext,\n    data: Partial<FeedbackChoiceJson>[] | undefined,\n  ): FeedbackChoiceJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildFeedbackChoice(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build feedbackChoice node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildFeedbackChoice(\n    context: BuildContext,\n    data: Partial<FeedbackChoiceJson> | undefined,\n  ): FeedbackChoiceJson | undefined {\n    if (!data) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: FeedbackChoiceJson = {\n      choice: data.choice ?? '',\n      requireReason: !!data.requireReason,\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(data.__isDefaultExample, data.example, true),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: ['item', 'hint', 'instruction'],\n      ignoreUndefined: ['example'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build feedbackReason node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildFeedbackReason(\n    context: BuildContext,\n    data: Partial<FeedbackReasonJson> | undefined,\n  ): FeedbackReasonJson | undefined {\n    if (!data) return undefined;\n\n    // Set default example\n    // Not __testAst - there is no default example\n    const defaultExample = this.handleJsonText(context, TextLocation.tag, 'true');\n\n    // NOTE: Node order is important and is defined here\n    const node: FeedbackReasonJson = {\n      text: data.text ?? '',\n      reasonableNumOfChars: (data.reasonableNumOfChars ?? undefined) as number,\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(data.__isDefaultExample, data.example, defaultExample),\n      __textAst: data.__textAst,\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: ['item', 'hint', 'instruction'],\n      ignoreUndefined: ['example', 'reasonableNumOfChars'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build choice[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildChoices(\n    context: BuildContext,\n    data: Partial<ChoiceJson>[] | undefined,\n  ): ChoiceJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildChoice(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build choice node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildChoice(\n    context: BuildContext,\n    data: Partial<ChoiceJson> | undefined,\n  ): ChoiceJson | undefined {\n    if (!data) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: ChoiceJson = {\n      choice: data.choice ?? '',\n      isCorrect: !!data.isCorrect,\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(data.__isDefaultExample, data.example, !!data.isCorrect),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: ['item', 'hint', 'instruction'],\n      ignoreUndefined: ['example'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build response[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildResponses(\n    context: BuildContext,\n    data: Partial<ResponseJson>[] | undefined,\n  ): ResponseJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildResponse(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build response node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildResponse(\n    context: BuildContext,\n    data: Partial<ResponseJson> | undefined,\n  ): ResponseJson | undefined {\n    if (!data) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: ResponseJson = {\n      response: data.response ?? '',\n      isCorrect: !!data.isCorrect,\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(data.__isDefaultExample, data.example, !!data.isCorrect),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: ['item', 'hint', 'instruction'],\n      ignoreUndefined: ['example'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build bot response[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildBotResponses(\n    context: BuildContext,\n    data: Partial<BotResponseJson>[] | undefined,\n  ): BotResponseJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.botResponse(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build bot response node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected botResponse(\n    context: BuildContext,\n    data: Partial<BotResponseJson> | undefined,\n  ): BotResponseJson | undefined {\n    if (!data) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: BotResponseJson = {\n      response: data.response ?? '',\n      reaction: data.reaction ?? '',\n      feedback: data.feedback ?? '',\n      item: data.item ?? '',\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreEmptyString: ['response', 'reaction', 'feedback', 'item'],\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: [],\n      ignoreUndefined: ['example'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build feedbacks[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildFeedbacks(\n    context: BuildContext,\n    data: Partial<FeedbackJson>[] | undefined,\n  ): FeedbackJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildFeedback(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build feedback node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildFeedback(\n    context: BuildContext,\n    data: Partial<FeedbackJson> | undefined,\n  ): FeedbackJson | undefined {\n    if (!data) return undefined;\n\n    let choices: FeedbackChoiceJson[] | undefined;\n    let reason: FeedbackReasonJson | undefined;\n\n    if (data.choices) {\n      choices = this.buildFeedbackChoices(context, data.choices);\n\n      // Push __isDefaultExample down the tree\n      // this.pushExampleDownTreeBoolean(context, data.__isDefaultExample, convertedExample.example, true, choices);\n    } else {\n      // No choices, not a valid feedback\n      return undefined;\n    }\n\n    if (data.reason) {\n      reason = this.buildFeedbackReason(context, data.reason);\n    }\n\n    // NOTE: Node order is important and is defined here\n    const node: FeedbackJson = {\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      // isExample: !!data.__defaultExample,\n      choices: choices as FeedbackChoiceJson[],\n      reason: reason as FeedbackReasonJson, // Might be undefined\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: ['item', 'hint', 'instruction'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build quizzes[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildQuizzes(\n    context: BuildContext,\n    data: Partial<QuizJson>[] | undefined,\n  ): QuizJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildQuiz(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build quiz node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildQuiz(\n    context: BuildContext,\n    data: Partial<QuizJson> | undefined,\n  ): QuizJson | undefined {\n    if (!data) return undefined;\n\n    const convertedExample = {\n      ...this.toExample(data.__isDefaultExample, data.__defaultExample),\n    };\n\n    let choices: ChoiceJson[] | undefined;\n    let responses: ResponseJson[] | undefined;\n\n    if (data.choices) {\n      choices = this.buildChoices(context, data.choices);\n\n      // Push __isDefaultExample down the tree\n      this.pushExampleDownTreeBoolean(\n        context,\n        data.__isDefaultExample,\n        convertedExample.example,\n        true,\n        choices,\n      );\n    } else if (data.responses) {\n      responses = this.buildResponses(context, data.responses);\n\n      // Push __isDefaultExample down the tree\n      this.pushExampleDownTreeBoolean(\n        context,\n        data.__isDefaultExample,\n        convertedExample.example,\n        false,\n        responses,\n      );\n    } else {\n      // No choices or responses, not a valid quiz\n      return undefined;\n    }\n\n    // NOTE: Node order is important and is defined here\n    const node: QuizJson = {\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      isExample: !!data.__defaultExample,\n      choices: choices as ChoiceJson[],\n      responses: responses as ResponseJson[],\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: ['item', 'hint', 'instruction'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build heading node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildHeading(\n    _context: BuildContext,\n    data: Partial<HeadingJson> | undefined,\n  ): HeadingJson | undefined {\n    if (!data) return undefined;\n    if (data.forKeys == null) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: HeadingJson = {\n      forKeys: data.forKeys ?? '',\n      forValues: data.forValues ?? data.__forValuesDefault ?? '',\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyString: ['forKeys', 'forValues'],\n      ignoreEmptyArrays: ['forValues'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build pair[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildPairs(\n    context: BuildContext,\n    data: Partial<PairJson>[] | undefined,\n  ): PairJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildPair(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build pair node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildPair(\n    context: BuildContext,\n    data: Partial<PairJson> | undefined,\n  ): PairJson | undefined {\n    if (!data) return undefined;\n\n    // Set default example\n    const defaultExample =\n      Array.isArray(data.__valuesAst) && data.__valuesAst.length > 0 ? data.__valuesAst[0] : null;\n\n    // Process the keyAudio and keyImage resources\n    const keyAudio = this.resourceBuilder.resourceFromResourceJson(\n      context,\n      data.keyAudio,\n    ) as AudioResourceWrapperJson;\n    const keyImage = this.resourceBuilder.resourceFromResourceJson(\n      context,\n      data.keyImage,\n    ) as ImageResourceWrapperJson;\n\n    // NOTE: Node order is important and is defined here\n    const node: PairJson = {\n      key: data.key ?? '',\n      keyAudio,\n      keyImage,\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      isCaseSensitive: data.isCaseSensitive as boolean,\n      ...this.toExample(data.__isDefaultExample, data.example, defaultExample),\n      values: data.values || [],\n      __valuesAst: data.__valuesAst,\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: ['item', 'hint', 'instruction', 'values'],\n      ignoreUndefined: ['example', 'isCaseSensitive'],\n    });\n\n    // if (node.key) {\n    //   delete node.keyAudio;\n    //   delete node.keyImage;\n    // }\n    // if (node.keyAudio != null) {\n    //   delete node.key;\n    //   delete node.keyImage;\n    // }\n    // if (node.keyImage != null) {\n    //   delete node.key;\n    //   delete node.keyAudio;\n    // }\n\n    return node;\n  }\n\n  /**\n   * Build matrix[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildMatricies(\n    context: BuildContext,\n    data: Partial<MatrixJson>[] | undefined,\n  ): MatrixJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildMatrix(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build matrix node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildMatrix(\n    context: BuildContext,\n    data: Partial<MatrixJson> | undefined,\n  ): MatrixJson | undefined {\n    if (!data) return undefined;\n\n    // const convertedExample = {\n    //   ...this.toExample(__isDefaultExample, example),\n    // };\n\n    // // Push __isDefaultExample down the tree\n    // this.pushExampleDownTreeBoolean(__isDefaultExample, convertedExample.example, true, choices);\n    // this.pushExampleDownTreeBoolean(__isDefaultExample, convertedExample.example, false, responses);\n\n    let isExample = false;\n\n    // Set isExample for matrix based on isExample for cells\n    for (const c of data.cells || []) {\n      if (!c) continue;\n      if (data.__isDefaultExample && !c.isExample) {\n        c.isExample = true;\n      }\n      isExample = c.isExample ? true : isExample;\n    }\n\n    // NOTE: Node order is important and is defined here\n    const node: MatrixJson = {\n      key: data.key ?? '',\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      isExample,\n      cells: (data.cells || [])\n        .map((c) => this.buildMatrixCell(context, c))\n        .filter((c) => c != null),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: ['hint', 'item', 'cells'],\n      ignoreUndefined: ['isCaseSensitive'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build matrixCell node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildMatrixCell(\n    context: BuildContext,\n    data: Partial<MatrixCellJson> | undefined,\n  ): MatrixCellJson | undefined {\n    if (!data) return undefined;\n\n    // Set default example\n    const defaultExample =\n      Array.isArray(data.__valuesAst) && data.__valuesAst.length > 0 ? data.__valuesAst[0] : null;\n\n    // NOTE: Node order is important and is defined here\n    const node: MatrixCellJson = {\n      values: data.values || [],\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      isCaseSensitive: data.isCaseSensitive as boolean,\n      ...this.toExample(data.__isDefaultExample, data.example, defaultExample),\n      __valuesAst: data.__valuesAst,\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: ['instruction', 'item', 'values'],\n      ignoreUndefined: ['example', 'isCaseSensitive'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build pronunciation table node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildPronunciationTable(\n    context: BuildContext,\n    dataIn: Partial<PronunciationTableJson> | undefined,\n  ): PronunciationTableJson | undefined {\n    if (!dataIn) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: PronunciationTableJson = {\n      data: (dataIn.data || []).map((row) =>\n        (row || []).map((cell) => {\n          // Process the audio resource\n          const audio = this.resourceBuilder.resourceFromResourceJson(\n            context,\n            cell.audio,\n          ) as AudioResourceWrapperJson;\n\n          return {\n            title: this.handleJsonText(context, TextLocation.tag, cell.title),\n            body: this.handleJsonText(context, TextLocation.tag, cell.body),\n            audio,\n          };\n        }),\n      ),\n    };\n\n    // Remove Unset Optionals\n    // ObjectUtils.removeUnwantedProperties(node, {\n    //   ignoreAllFalse: true,\n    // });\n\n    return node;\n  }\n\n  /**\n   * Build table / table extended node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildTable(\n    context: BuildContext,\n    dataIn: Partial<TableJson | TableExtendedJson> | undefined,\n  ): TableJson | TableExtendedJson | undefined {\n    if (!dataIn) return undefined;\n\n    const node = normalizeTableFormat(context.bitType, dataIn as TableJson | TableExtendedJson);\n    const nodeTable = node as TableJson;\n    const nodeTableExtended = node as TableExtendedJson;\n\n    // Parse standard table properties\n    if (Array.isArray(nodeTable.columns) && nodeTable.columns.length > 0) {\n      nodeTable.columns = nodeTable.columns.map((col) =>\n        this.handleJsonText(context, TextLocation.tag, col),\n      );\n    }\n\n    if (Array.isArray(nodeTable.data) && nodeTable.data.length > 0) {\n      nodeTable.data = nodeTable.data.map((row) =>\n        (row || []).map((cell) => this.handleJsonText(context, TextLocation.tag, cell)),\n      );\n    }\n\n    if (Array.isArray(nodeTable.columnWidths)) {\n      const columnCount = Array.isArray(nodeTable.columns) ? nodeTable.columns.length : undefined;\n      const source =\n        columnCount != null ? nodeTable.columnWidths.slice(0, columnCount) : nodeTable.columnWidths;\n      const normalized = source.map((w) => (typeof w === 'number' && w > 0 ? w : null));\n      const hasAny = normalized.some((w) => w != null);\n      if (hasAny) {\n        nodeTable.columnWidths = normalized;\n      } else {\n        delete nodeTable.columnWidths;\n      }\n    }\n\n    // Parse extended table properties\n    const buildSection = (section: TableSectionJson | undefined): TableSectionJson | undefined => {\n      if (!section || !Array.isArray(section.rows)) return undefined;\n\n      const rows = section.rows.map((row: Partial<TableRowJson>) => {\n        const cells = (row.cells || []).map((cell: Partial<TableCellJson>) => {\n          const tableCell: TableCellJson = {\n            content: this.handleJsonText(context, TextLocation.tag, cell.content),\n          };\n\n          if (cell.title != null) tableCell.title = cell.title;\n          if (cell.rowspan != null) tableCell.rowspan = cell.rowspan;\n          if (cell.colspan != null) tableCell.colspan = cell.colspan;\n          if (cell.scope) tableCell.scope = cell.scope;\n          if (cell.colwidth != null) tableCell.colwidth = cell.colwidth;\n\n          return tableCell;\n        });\n\n        return {\n          cells,\n        };\n      });\n\n      return {\n        rows,\n      };\n    };\n\n    const header = buildSection(nodeTableExtended.header);\n    if (header && header.rows?.length > 0) nodeTableExtended.header = header;\n\n    const body = buildSection(nodeTableExtended.body);\n    if (body && body.rows?.length > 0) nodeTableExtended.body = body;\n\n    const footer = buildSection(nodeTableExtended.footer);\n    if (footer && footer.rows?.length > 0) nodeTableExtended.footer = footer;\n\n    // Remove Unset Optionals\n    // ObjectUtils.removeUnwantedProperties(node, {\n    //   ignoreAllFalse: true,\n    // });\n\n    return node;\n  }\n\n  /**\n   * Build question[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildQuestions(\n    context: BuildContext,\n    data: Partial<QuestionJson>[] | undefined,\n  ): QuestionJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildQuestion(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build question node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildQuestion(\n    context: BuildContext,\n    data: Partial<QuestionJson> | undefined,\n  ): QuestionJson | undefined {\n    if (!data) return undefined;\n\n    // Set default example\n    const defaultExample = data.__sampleSolutionAst;\n\n    // NOTE: Node order is important and is defined here\n    const node: QuestionJson = {\n      question: this.handleJsonText(context, TextLocation.body, data.question),\n      partialAnswer: data.partialAnswer ?? '',\n      sampleSolution: data.sampleSolution ?? '',\n      additionalSolutions: (data.additionalSolutions ?? undefined) as string[],\n      reasonableNumOfChars: (data.reasonableNumOfChars ?? undefined) as number,\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(data.__isDefaultExample, data.example, defaultExample),\n      __sampleSolutionAst: data.__sampleSolutionAst,\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: ['question', 'item', 'hint', 'instruction'],\n      ignoreUndefined: ['example'],\n      ignoreEmptyString: ['partialAnswer', 'sampleSolution'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build ingredient[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildIngredients(\n    context: BuildContext,\n    data: Partial<IngredientJson>[] | undefined,\n  ): IngredientJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildIngredient(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build ingredient node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildIngredient(\n    context: BuildContext,\n    data: Partial<IngredientJson> | undefined,\n  ): IngredientJson | undefined {\n    if (!data) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: IngredientJson = {\n      title: this.handleJsonText(context, TextLocation.tag, data.title),\n      checked: data.checked ?? false,\n      ingredient: this.handleJsonText(context, TextLocation.tag, data.ingredient),\n      quantity: data.quantity ?? 0,\n      unit: data.unit ?? '',\n      unitPlural: data.unitPlural ?? '',\n      unitAbbr: data.unitAbbr ?? '',\n      unitAbbrPlural: data.unitAbbrPlural ?? '',\n      decimalPlaces: data.decimalPlaces ?? 1,\n      disableCalculation: data.disableCalculation ?? false,\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      // ignoreAllEmptyArrays: true,\n      // ignoreUndefined: ['example'],\n      ignoreEmptyString: ['item', 'unit'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build body node\n   * - Handles JSON, Bitmark text, and plain text\n   *   - body: set to either string, TextAst, or JSON\n   *   - bodyBits: set to array of BodyBitJson (will be validated and merged into body if it is a string)\n   *   - placeholders: set to placeholders from v2 JSON when body is a v2 JSON string\n   *   - bodyString: set to the original string if body is a string (only used for card body)\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildBody(context: BuildContext, data: Partial<Body> | undefined): Body | undefined {\n    if (!data) return undefined;\n    let body: JsonText | unknown | undefined;\n    const bodyBits: BodyBitJson[] = [];\n    const placeholders = data.placeholders;\n    const bodyString = data.bodyString;\n    const { textFormat } = context;\n\n    // Handle JSON type body\n    const handleJsonBody = () => {\n      // Attempt to parse a string body as JSON to support the legacy format\n      if (typeof data.body === 'string') {\n        try {\n          body = JSON.parse(data.body);\n        } catch (_e) {\n          // Could not parse JSON - set body to null\n          body = null;\n        }\n      } else {\n        body = data.body;\n      }\n    };\n\n    // Handle Bitmark text type body (both AST v3 and plain text v2)\n    const handleBitmarkTextBody = () => {\n      let rawBody: TextAst = data.body as TextAst;\n      let bodyStr: BreakscapedString | undefined;\n      const placeholderNodes: {\n        [keyof: string]: BodyBitJson;\n      } = {};\n      // TODO - process body bits through the correct builders.\n\n      if (StringUtils.isString(data.body)) {\n        // Body is a string (legacy bitmark v2, or not bitmarkText)\n        bodyStr = ((data.body as BreakscapedString) ?? '').trim() as BreakscapedString;\n        rawBody = [];\n      } else if (Array.isArray(data.body)) {\n        // Body is an array (prosemirror like JSON)\n        // Already in the correct format\n      } else {\n        // body is invalid\n        rawBody = [];\n      }\n\n      if (placeholders) {\n        for (const [key, val] of Object.entries(placeholders)) {\n          // const bit = this.bodyBitToAst(val);\n          // placeholderNodes[key] = bit as BodyBit;\n          placeholderNodes[key] = val as BodyBitJson;\n        }\n      }\n\n      if (bodyStr) {\n        // Bug #7141: Use textFormat for textParser, not always bitmarkText if it is a v2 string body\n        // However, only use plain text breakscaping the text from the v2 JSON body\n\n        // Special v2 Breakscaping\n        bodyStr = Breakscape.breakscape(bodyStr, {\n          format: textFormat,\n          location: TextLocation.body,\n          v2: true,\n        });\n\n        // Convert placeholders {1} to [!1], etc.\n        let index = 0;\n        const newPlaceholderNodes: BodyBitJson[] = [];\n        for (const [key, val] of Object.entries(placeholderNodes)) {\n          if (bodyStr) {\n            const newKey = `[!${index}]`;\n            bodyStr = bodyStr.replace(`${key}`, newKey) as BreakscapedString;\n            newPlaceholderNodes.push(val);\n            index++;\n          }\n        }\n\n        // Convert the body string to AST\n        rawBody = this.textParser.toAst(bodyStr, {\n          format: textFormat,\n          location: TextLocation.body,\n        });\n\n        const replaceBitsRecursive = (bodyText: TextAst) => {\n          for (let i = 0, len = bodyText.length; i < len; i++) {\n            const bodyPart = bodyText[i];\n            if ((bodyPart.type as string) === 'bit') {\n              // eslint-disable-next-line @typescript-eslint/no-explicit-any\n              const index = (bodyPart as any).index as number;\n              if (newPlaceholderNodes[index] != null) {\n                bodyText[i] = newPlaceholderNodes[index] as TextNode;\n              }\n            } else {\n              if (bodyPart.content) replaceBitsRecursive(bodyPart.content);\n            }\n          }\n        };\n\n        // Replace the placeholders with the AST\n        replaceBitsRecursive(rawBody);\n      }\n\n      // Process the body bits to ensure they are valid\n      // Walking the body bits will change them, so we should make a copy before processing\n      rawBody = structuredClone(rawBody);\n      this.textParser.walkBodyBits(rawBody, (parent, index, bodyBit) => {\n        // Ensure the body bit is valid\n        let parsedBit: BodyBitJson | undefined;\n        switch (bodyBit.type) {\n          case BodyBitType.gap:\n            parsedBit = this.buildGap(context, bodyBit as GapJson);\n            break;\n          case BodyBitType.mark:\n            parsedBit = this.buildMark(context, bodyBit as MarkJson);\n            break;\n          case BodyBitType.select:\n            parsedBit = this.buildSelect(context, bodyBit as SelectJson);\n            break;\n          case BodyBitType.highlight:\n            parsedBit = this.buildHighlight(context, bodyBit as HighlightJson);\n            break;\n          default:\n          // TODO?? Ensure other parts are valid\n        }\n        if (parsedBit != undefined) {\n          parent[index] = parsedBit as TextNode;\n          bodyBits.push(parsedBit);\n        }\n      });\n\n      // Set the body\n      body = rawBody;\n\n      // Mark the body as text\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      (body as any).__tag = 'text';\n    };\n\n    const handlePlainTextBody = () => {\n      body = data.body as string;\n    };\n\n    const isBitmarkText = textFormat === TextFormat.bitmarkText;\n    if (textFormat === TextFormat.json) {\n      // JSON\n      handleJsonBody();\n    } else if (isBitmarkText) {\n      // Bitmark text (either ast or string)\n      handleBitmarkTextBody();\n    } else {\n      // Text but not bitmark (plain text)\n      handlePlainTextBody();\n    }\n\n    const node: Body = {\n      body,\n      bodyBits,\n      bodyString,\n      // Placeholders are only ever parsed into AST, never stored directly\n    };\n\n    return node;\n  }\n\n  /**\n   * Build footer node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildFooter(\n    context: BuildContext,\n    data: Partial<Footer> | undefined,\n  ): Footer | undefined {\n    if (!data) return undefined;\n    const node: Footer = {\n      footer: this.handleJsonText(context, TextLocation.body, data.footer),\n    };\n\n    return node;\n  }\n\n  /**\n   * Build gap node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildGap(\n    context: BuildContext,\n    data: Partial<GapJson> | undefined,\n  ): GapJson | undefined {\n    if (!data) return undefined;\n\n    // Set default example\n    const defaultExample =\n      Array.isArray(data.__solutionsAst) && data.__solutionsAst.length > 0\n        ? data.__solutionsAst[0]\n        : null;\n\n    // Copy any attributes from 'attrs' to the body bit (data is in 'attrs' when coming from JSON)\n    data = this.bodyBitCopyFromAttrs(data);\n\n    // NOTE: Node order is important and is defined here\n    const node: GapJson = {\n      type: BodyBitType.gap,\n      solutions: data.solutions || [], // Must be before other properties except type\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      isCaseSensitive: data.isCaseSensitive as boolean,\n      ...this.toExample(data.__isDefaultExample, data.example, defaultExample),\n      __solutionsAst: data.__solutionsAst,\n\n      attrs: {},\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreAllEmptyArrays: true,\n      ignoreUndefined: ['example', 'isCaseSensitive'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build mark configs node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildMarkConfigs(\n    context: BuildContext,\n    data: Partial<MarkConfigJson>[] | undefined,\n  ): MarkConfigJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildMarkConfig(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build mark config node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildMarkConfig(\n    _context: BuildContext,\n    data: Partial<MarkConfigJson> | undefined,\n  ): MarkConfigJson | undefined {\n    if (!data) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: MarkConfigJson = {\n      mark: data.mark ?? 'unknown',\n      color: data.color ?? '',\n      emphasis: data.emphasis ?? '',\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllEmptyString: true,\n    });\n\n    return node;\n  }\n\n  /**\n   * Build mark node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildMark(\n    context: BuildContext,\n    data: Partial<MarkJson> | undefined,\n  ): MarkJson | undefined {\n    if (!data) return undefined;\n\n    // Copy any attributes from 'attrs' to the body bit (data is in 'attrs' when coming from JSON)\n    data = this.bodyBitCopyFromAttrs(data);\n\n    // NOTE: Node order is important and is defined here\n    const node: MarkJson = {\n      type: BodyBitType.mark,\n      solution: data.solution ?? '', // Must be before other properties except type\n      mark: data.mark ?? '',\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(data.__isDefaultExample, data.example, true),\n\n      attrs: {},\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreAllEmptyArrays: true,\n      ignoreUndefined: ['example'],\n      ignoreEmptyString: ['solution', 'mark'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build select node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildSelect(\n    context: BuildContext,\n    data: Partial<SelectJson> | undefined,\n  ): SelectJson | undefined {\n    if (!data) return undefined;\n\n    // Copy any attributes from 'attrs' to the body bit (data is in 'attrs' when coming from JSON)\n    data = this.bodyBitCopyFromAttrs(data);\n\n    // NOTE: Node order is important and is defined here\n    const node: SelectJson = {\n      type: BodyBitType.select,\n      options: this.buildSelectOptions(context, data.options) || [], // Must be before other properties except type\n      prefix: data.prefix ?? '',\n      postfix: data.postfix ?? '',\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(false, undefined, undefined), // Will be set in later\n      __hintString: data.__hintString,\n      __instructionString: data.__instructionString,\n\n      attrs: {},\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreAllEmptyArrays: true,\n      ignoreEmptyString: ['prefix', 'postfix'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build selectOption[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildSelectOptions(\n    context: BuildContext,\n    data: Partial<SelectOptionJson>[] | undefined,\n  ): SelectOptionJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildSelectOption(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build selectOption node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildSelectOption(\n    context: BuildContext,\n    data: Partial<SelectOptionJson> | undefined,\n  ): SelectOptionJson | undefined {\n    if (!data) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: SelectOptionJson = {\n      text: data.text ?? '', // Must be before other properties except type\n      isCorrect: !!data.isCorrect,\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(data.__isDefaultExample, data.example, !!data.isCorrect),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreAllEmptyArrays: true,\n      ignoreUndefined: ['example'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build highlight node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  buildHighlight(\n    context: BuildContext,\n    data: Partial<HighlightJson> | undefined,\n  ): HighlightJson | undefined {\n    if (!data) return undefined;\n\n    // Copy any attributes from 'attrs' to the body bit (data is in 'attrs' when coming from JSON)\n    data = this.bodyBitCopyFromAttrs(data);\n\n    // NOTE: Node order is important and is defined here\n    const node: HighlightJson = {\n      type: BodyBitType.highlight,\n      texts: this.buildHighlightTexts(context, data.texts) || [], // Must be before other properties except type\n      prefix: data.prefix ?? '',\n      postfix: data.postfix ?? '',\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(false, undefined, undefined), // Will be set in later\n\n      attrs: {},\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreAllEmptyArrays: true,\n      ignoreEmptyString: ['prefix', 'postfix'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build highlightText[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildHighlightTexts(\n    context: BuildContext,\n    data: Partial<HighlightTextJson>[] | undefined,\n  ): HighlightTextJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildHighlightText(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build highlightText node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildHighlightText(\n    context: BuildContext,\n    data: Partial<HighlightTextJson> | undefined,\n  ): HighlightTextJson | undefined {\n    if (!data) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: HighlightTextJson = {\n      text: data.text ?? '', // Must be before other properties except type\n      isCorrect: !!data.isCorrect,\n      isHighlighted: !!data.isHighlighted,\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(data.__isDefaultExample, data.example, !!data.isCorrect),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreAllEmptyArrays: true,\n      ignoreUndefined: ['example'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build flashcards node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildFlashcards(\n    context: BuildContext,\n    data: Partial<FlashcardJson>[] | undefined,\n  ): FlashcardJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildFlashcard(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build flashcard node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildFlashcard(\n    context: BuildContext,\n    data: Partial<FlashcardJson> | undefined,\n  ): FlashcardJson | undefined {\n    if (!data) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: FlashcardJson = {\n      question: this.buildTextAndIcon(context, data.question) as TextAndIconJson,\n      answer: this.buildTextAndIcon(context, data.answer) as TextAndIconJson,\n      alternativeAnswers: (data.alternativeAnswers || [])\n        .map((d) => this.buildTextAndIcon(context, d))\n        .filter((d) => d != null),\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(data.__isDefaultExample, data.example, true),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: [\n        'question',\n        'answer',\n        'alternativeAnswers',\n        'item',\n        'hint',\n        'instruction',\n      ],\n      ignoreUndefined: ['example'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build definitionListItem[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildDefinitionList(\n    context: BuildContext,\n    data: Partial<DefinitionListItemJson>[] | undefined,\n  ): DefinitionListItemJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data\n      .map((d) => this.buildDefinitionListItem(context, d))\n      .filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build definitionListItem node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildDefinitionListItem(\n    context: BuildContext,\n    data: Partial<DefinitionListItemJson> | undefined,\n  ): DefinitionListItemJson | undefined {\n    if (!data) return undefined;\n\n    const { bitType } = context;\n\n    const textAsStrings = Config.isOfBitType(bitType, [BitType.metaSearchDefaultTerms]);\n\n    // NOTE: Node order is important and is defined here\n    const node: DefinitionListItemJson = {\n      term: this.buildTextAndIcon(context, data.term, textAsStrings) as TextAndIconJson,\n      definition: this.buildTextAndIcon(context, data.definition, textAsStrings) as TextAndIconJson,\n      alternativeDefinitions: (data.alternativeDefinitions || [])\n        .map((d) => this.buildTextAndIcon(context, d, textAsStrings))\n        .filter((d) => d != null),\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(data.__isDefaultExample, data.example, true),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: [\n        'question',\n        'answer',\n        'alternativeDefinitions',\n        'item',\n        'hint',\n        'instruction',\n      ],\n      ignoreUndefined: ['example'],\n    });\n\n    return node;\n  }\n\n  protected buildTextAndIcon(\n    context: BuildContext,\n    data: Partial<TextAndIconJson> | undefined,\n    textAsStrings: boolean = false,\n  ): TextAndIconJson | undefined {\n    const icon = this.resourceBuilder.resourceFromResourceJson(\n      context,\n      data?.icon,\n    ) as ImageResourceWrapperJson;\n\n    // Ensure text is bitmark text\n    let text: JsonText = this.handleJsonText(\n      context,\n      TextLocation.tag,\n      data?.text || (data as string),\n    );\n\n    if (textAsStrings) {\n      // Convert the bitmark text to plain text (without breakscaping, as that will happen in the Bitmark Generator)\n      text = this.textGenerator\n        .generateSync(text as TextAst, TextFormat.plainText, TextLocation.body, {\n          noBreakscaping: true,\n        })\n        .trim();\n    }\n\n    // NOTE: Node order is important and is defined here\n    const node: TextAndIconJson = {\n      text,\n      icon,\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreEmptyArrays: ['text'],\n      ignoreUndefined: ['icon'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build statement[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildStatements(\n    context: BuildContext,\n    data: Partial<StatementJson>[] | undefined,\n  ): StatementJson[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildStatement(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build statement node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildStatement(\n    context: BuildContext,\n    data: Partial<StatementJson> | undefined,\n  ): StatementJson | undefined {\n    if (!data) return undefined;\n\n    // NOTE: Node order is important and is defined here\n    const node: StatementJson = {\n      statement: this.handleJsonText(context, TextLocation.tag, data.statement),\n      isCorrect: !!data.isCorrect,\n      item: this.handleJsonText(context, TextLocation.tag, data.item),\n      lead: this.handleJsonText(context, TextLocation.tag, data.lead),\n      hint: this.handleJsonText(context, TextLocation.tag, data.hint),\n      instruction: this.handleJsonText(context, TextLocation.tag, data.instruction),\n      ...this.toExample(data.__isDefaultExample, data.example, !!data.isCorrect),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      ignoreEmptyArrays: ['statement'],\n      ignoreUndefined: ['example'],\n    });\n\n    return node;\n  }\n\n  /**\n   * Build (image-on-device) imageSource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildImageSource(\n    _context: BuildContext,\n    data: Partial<ImageSourceJson> | undefined,\n  ): ImageSourceJson | undefined {\n    if (!data) return undefined;\n    const { url, mockupId, size, format, trim } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: ImageSourceJson = {\n      url: url ?? '',\n      mockupId: mockupId ?? '',\n      size: (size ?? null) as number,\n      format: (format ?? null) as string,\n      trim: (BooleanUtils.isBoolean(trim) ? trim : null) as boolean,\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreFalse: ['trim'],\n      ignoreEmptyString: ['url', 'mockupId'],\n      ignoreAllUndefined: true,\n    });\n\n    return node;\n  }\n\n  /**\n   * Build (chat) person node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildPerson(\n    context: BuildContext,\n    data: Partial<PersonJson> | undefined,\n  ): PersonJson | undefined {\n    if (!data) return undefined;\n    const { name, title, avatarImage } = data;\n    // { name: string; title?: string; avatarImage?: ImageResourceJson }\n\n    // NOTE: Node order is important and is defined here\n    const node: PersonJson = {\n      name: name ?? '',\n      title: (title ?? undefined) as string,\n      avatarImage: this.resourceBuilder.resourceFromResourceJson(\n        context,\n        avatarImage,\n      ) as ImageResourceWrapperJson,\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreEmptyString: ['name'],\n      ignoreAllUndefined: true,\n    });\n\n    return node;\n  }\n\n  /**\n   * Build (cook-ingredients) technicalTerm node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildTechnicalTerm(\n    _context: BuildContext,\n    data: Partial<TechnicalTermJson> | undefined,\n  ): TechnicalTermJson | undefined {\n    if (!data) return undefined;\n    const { technicalTerm, lang } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: TechnicalTermJson = {\n      technicalTerm: technicalTerm ?? '',\n      lang: lang ?? '',\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreEmptyString: ['technicalTerm'],\n      // ignoreAllUndefined: true,\n    });\n\n    return node;\n  }\n\n  /**\n   * Build (cook-ingredients) servings node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildServings(\n    _context: BuildContext,\n    data: Partial<ServingsJson> | undefined,\n  ): ServingsJson | undefined {\n    if (!data) return undefined;\n    const {\n      servings,\n      unit,\n      unitPlural,\n      unitAbbr,\n      unitAbbrPlural,\n      decimalPlaces,\n      disableCalculation,\n      hint,\n    } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: ServingsJson = {\n      servings: servings ?? 0,\n      unit: unit ?? '',\n      unitPlural: unitPlural ?? '',\n      unitAbbr: unitAbbr ?? '',\n      unitAbbrPlural: unitAbbrPlural ?? '',\n      decimalPlaces: decimalPlaces ?? 1,\n      disableCalculation: disableCalculation ?? false,\n      hint: hint ?? '',\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreEmptyString: ['servings', 'unit'],\n      // ignoreAllUndefined: true,\n    });\n\n    return node;\n  }\n\n  /**\n   * Build (survey-rating) ratingLevelStart / ratingLevelEnd node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildRatingLevelStartEnd(\n    context: BuildContext,\n    data: Partial<RatingLevelStartEndJson> | undefined,\n  ): RatingLevelStartEndJson | undefined {\n    if (!data) return undefined;\n    const { level, label } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: RatingLevelStartEndJson = {\n      level: level ?? 0,\n      label: this.handleJsonText(context, TextLocation.tag, label),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      // ignoreEmptyArrays: ['servings', 'unit'],\n      // ignoreAllUndefined: true,\n    });\n\n    return node;\n  }\n\n  // DEPRECATED - TO BE REMOVED IN FUTURE\n  // /**\n  //  * Build captionDefinition node\n  //  *\n  //  * @param data - data for the node\n  //  * @returns\n  //  */\n  // protected buildCaptionDefinition(\n  //   _context: BuildContext,\n  //   data: Partial<CaptionDefinitionJson> | undefined,\n  // ): CaptionDefinitionJson | undefined {\n  //   if (!data) return undefined;\n\n  //   // NOTE: Node order is important and is defined here\n  //   const node: CaptionDefinitionJson = {\n  //     // term: this.convertJsonTextToAstText(data.term),\n  //     // description: this.convertJsonTextToAstText(data.description),\n  //     term: data.term ?? '',\n  //     definition: data.definition ?? '',\n  //   };\n\n  //   // Remove Unset Optionals\n  //   ObjectUtils.removeUnwantedProperties(node, {\n  //     ignoreEmptyString: ['term', 'description'],\n  //     // ignoreAllUndefined: true,\n  //   });\n\n  //   return node;\n  // }\n\n  // /**\n  //  * Build captionDefinitionList node\n  //  *\n  //  * @param data - data for the node\n  //  * @returns\n  //  */\n  // protected buildCaptionDefinitionList(\n  //   context: BuildContext,\n  //   data: Partial<CaptionDefinitionListJson> | undefined,\n  // ): CaptionDefinitionListJson | undefined {\n  //   if (!data) return undefined;\n\n  //   // NOTE: Node order is important and is defined here\n  //   const node: CaptionDefinitionListJson = {\n  //     columns: data.columns || [],\n  //     definitions: (data.definitions || [])\n  //       .map((d) => {\n  //         return this.buildCaptionDefinition(context, {\n  //           term: d.term,\n  //           definition: d.definition,\n  //         });\n  //       })\n  //       .filter((d) => d != null),\n  //   };\n\n  //   // Remove Unset Optionals\n  //   ObjectUtils.removeUnwantedProperties(node, {\n  //     ignoreAllEmptyArrays: true,\n  //   });\n\n  //   return node;\n  // }\n\n  /**\n   * Build card bit[] node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildCardBits(\n    context: BuildContext,\n    data: Partial<CardBit>[] | undefined,\n  ): Bit[] | undefined {\n    if (!Array.isArray(data)) return undefined;\n    const nodes = data.map((d) => this.buildCardBit(context, d)).filter((d) => d != null);\n    return nodes.length > 0 ? nodes : undefined;\n  }\n\n  /**\n   * Build card bit node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  protected buildCardBit(\n    context: BuildContext,\n    data: Partial<CardBit> | undefined,\n  ): CardBit | undefined {\n    if (!data) return undefined;\n    const { bitType, textFormat } = context;\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const node = this.buildBit({ ...data, bitType, textFormat } as any, {\n      cardSet: {\n        sideNo: 0,\n        variantNo: 0,\n      },\n    }) as CardBit;\n\n    // // NOTE: Node order is important and is defined here\n    // const node: CardBit = {\n    //   item: this.handleJsonText(data.item),\n    //   lead: this.handleJsonText(data.lead),\n    //   hint: this.handleJsonText(data.hint),\n    //   instruction: this.handleJsonText(data.instruction),\n    //   ...this.toExample(data.__isDefaultExample, data.example),\n    //   __isDefaultExample: data.__isDefaultExample ?? false,\n    //   body: this.buildBody(textFormat, data.body),\n\n    //   // Must always be last in the AST so key clashes are avoided correctly with other properties\n    //   extraProperties: this.parseExtraProperties(data.extraProperties),\n    // };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreAllFalse: true,\n      // ignoreEmptyArrays: ['example'],\n      ignoreUndefined: ['example'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateCardBit(node);\n  }\n\n  protected toImageResource(\n    context: BuildContext,\n    data: Partial<ImageResourceWrapperJson> | undefined,\n  ): ImageResourceWrapperJson {\n    return ArrayUtils.asSingle(\n      this.resourceBuilder.resourceFromResourceDataJson(context, ResourceType.image, data?.image),\n    ) as ImageResourceWrapperJson;\n  }\n\n  protected toImageResources(\n    context: BuildContext,\n    data: Partial<ImageResourceWrapperJson> | Partial<ImageResourceWrapperJson>[] | undefined,\n  ): ImageResourceWrapperJson[] {\n    const arr = ArrayUtils.asArray(data);\n\n    const results: ImageResourceWrapperJson[] = [];\n    if (arr && arr.length > 0) {\n      for (const item of arr) {\n        const res = this.resourceBuilder.resourceFromResourceDataJson(\n          context,\n          ResourceType.image,\n          item.image,\n        );\n        results.push(res as ImageResourceWrapperJson);\n      }\n    }\n\n    return results;\n  }\n\n  protected toVideoResources(\n    context: BuildContext,\n    data: Partial<VideoResourceWrapperJson> | Partial<VideoResourceWrapperJson>[] | undefined,\n  ): VideoResourceWrapperJson[] {\n    const arr = ArrayUtils.asArray(data);\n\n    const results: VideoResourceWrapperJson[] = [];\n    if (arr && arr.length > 0) {\n      for (const item of arr) {\n        const res = this.resourceBuilder.resourceFromResourceDataJson(\n          context,\n          ResourceType.video,\n          item.video,\n        );\n        results.push(res as VideoResourceWrapperJson);\n      }\n    }\n\n    return results;\n  }\n\n  //\n  // Private\n  //\n\n  private buildCardNode(\n    context: BuildContext,\n    data: {\n      flashcards?: Partial<FlashcardJson>[];\n      definitions?: Partial<DefinitionListItemJson>[];\n      legend?: Partial<DefinitionListItemJson>[];\n      questions?: Partial<QuestionJson>[];\n      elements?: JsonText[];\n      statement?: Partial<StatementJson>;\n      statements?: Partial<StatementJson>[];\n      choices?: Partial<ChoiceJson>[];\n      responses?: Partial<ResponseJson>[];\n      feedbacks?: Partial<FeedbackJson>[];\n      quizzes?: Partial<QuizJson>[];\n      heading?: Partial<HeadingJson>;\n      pairs?: Partial<PairJson>[];\n      matrix?: Partial<MatrixJson>[];\n      pronunciationTable?: Partial<PronunciationTableJson>;\n      table?: Partial<TableJson | TableExtendedJson>;\n      botResponses?: Partial<BotResponseJson>[];\n      ingredients?: Partial<IngredientJson>[];\n      // DEPRECATED - TO BE REMOVED IN FUTURE\n      // captionDefinitionList?: Partial<CaptionDefinitionListJson>;\n      cardBits?: Partial<CardBit>[];\n    },\n  ): CardNode | undefined {\n    const node: CardNode = {\n      heading: this.buildHeading(context, data.heading),\n      questions: this.buildQuestions(context, data.questions),\n      elements: this.handleJsonText(context, TextLocation.body, data.elements),\n      flashcards: this.buildFlashcards(context, data.flashcards),\n      definitions: this.buildDefinitionList(context, data.definitions ?? data.legend),\n      statement: this.buildStatement(context, data.statement),\n      statements: this.buildStatements(context, data.statements),\n      choices: this.buildChoices(context, data.choices),\n      responses: this.buildResponses(context, data.responses),\n      feedbacks: this.buildFeedbacks(context, data.feedbacks),\n      quizzes: this.buildQuizzes(context, data.quizzes),\n      pairs: this.buildPairs(context, data.pairs),\n      matrix: this.buildMatricies(context, data.matrix),\n      pronunciationTable: this.buildPronunciationTable(context, data.pronunciationTable),\n      table: this.buildTable(context, data.table),\n      botResponses: this.buildBotResponses(context, data.botResponses),\n      ingredients: this.buildIngredients(context, data.ingredients),\n      // DEPRECATED - TO BE REMOVED IN FUTURE\n      // captionDefinitionList: this.buildCaptionDefinitionList(context, data.captionDefinitionList),\n      cardBits: this.buildCardBits(context, data.cardBits),\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node, {\n      ignoreEmptyObjects: ['table'],\n    });\n\n    return Object.keys(node).length > 0 ? node : undefined;\n  }\n\n  /**\n   * Copy any attributes from 'attrs' property to the root node (necessary when the input if from JSON)\n   * The values in 'attrs' will overwrite any existing values in the node\n   *\n   * The original object is not modified, a new object is returned\n   *\n   * @param data\n   */\n  private bodyBitCopyFromAttrs<T extends Partial<BodyBitJson>>(data: T): T {\n    const copy = { ...data };\n    // Copy any attributes from 'attrs' to the node (necessary when the input if from JSON)\n    if (data.attrs) {\n      for (const [key, value] of Object.entries(data.attrs)) {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        (copy as any)[key] = value;\n      }\n    }\n\n    return copy;\n  }\n\n  /**\n   * Set examples down the tree\n   *\n   * @param body\n   * @param cardNode\n   * @param __isDefaultExample\n   * @param example\n   * @returns true if any of the answers has an example, otherwise undefined\n   */\n  private pushExampleDownTree(\n    context: BuildContext,\n    body: Body | undefined,\n    cardNode: CardNode | undefined,\n    __isDefaultExample: boolean | undefined,\n    example: ExampleJson | undefined,\n  ): void {\n    if (__isDefaultExample || example != null) {\n      if (cardNode) {\n        this.pushExampleDownTreeString(\n          context,\n          __isDefaultExample,\n          example,\n          cardNode.pairs as WithExampleJson[],\n        );\n        this.pushExampleDownTreeBoolean(\n          context,\n          __isDefaultExample,\n          example,\n          false,\n          cardNode.flashcards as WithExampleJson[],\n        );\n        this.pushExampleDownTreeBoolean(\n          context,\n          __isDefaultExample,\n          example,\n          false,\n          cardNode.definitions as WithExampleJson[],\n        );\n        this.pushExampleDownTreeBoolean(\n          context,\n          __isDefaultExample,\n          example,\n          true,\n          cardNode.choices as WithExampleJson[],\n        );\n        this.pushExampleDownTreeBoolean(\n          context,\n          __isDefaultExample,\n          example,\n          false,\n          cardNode.responses,\n          cardNode.statements,\n          cardNode.statement,\n        );\n        if (cardNode.quizzes) {\n          for (const quiz of cardNode.quizzes) {\n            this.pushExampleDownTreeBoolean(\n              context,\n              __isDefaultExample,\n              example,\n              true,\n              quiz.choices as WithExampleJson[] | undefined,\n            );\n            this.pushExampleDownTreeBoolean(\n              context,\n              __isDefaultExample,\n              example,\n              false,\n              quiz.responses as WithExampleJson[] | undefined,\n            );\n          }\n        }\n        if (cardNode.matrix) {\n          for (const m of cardNode.matrix) {\n            this.pushExampleDownTreeString(context, __isDefaultExample, example, m.cells);\n          }\n        }\n      }\n      if (body) {\n        this.pushExampleDownTreeBodyBits(context, __isDefaultExample, example, body);\n      }\n    }\n  }\n\n  /**\n   * Set examples for boolean nodes\n   *\n   * @param __isDefaultExample\n   * @param example\n   * @param onlyCorrect\n   * @param nodes\n   * @returns true if any of the answers has an example, otherwise undefined\n   */\n  private pushExampleDownTreeBoolean(\n    _context: BuildContext,\n    __isDefaultExample: boolean | undefined,\n    example: ExampleJson | undefined,\n    onlyCorrect: boolean,\n    ...nodes: (WithExampleJson | WithExampleJson[] | undefined)[]\n  ): void {\n    if (!__isDefaultExample && example == null) return;\n\n    if (Array.isArray(nodes)) {\n      for (const ds of nodes) {\n        if (ds) {\n          const exampleNodes = Array.isArray(ds) ? ds : [ds];\n          BitUtils.fillBooleanExample(exampleNodes, __isDefaultExample, example, onlyCorrect);\n        }\n      }\n    }\n  }\n\n  /**\n   * Set examples for string nodes\n   *\n   * @param __isDefaultExample\n   * @param example\n   * @param nodes\n   * @returns true if any of the answers has an example, otherwise undefined\n   */\n  private pushExampleDownTreeString(\n    context: BuildContext,\n    __isDefaultExample: boolean | undefined,\n    example: ExampleJson | undefined,\n    ...nodes: (WithExampleJson | WithExampleJson[] | undefined)[]\n  ): void {\n    if (!__isDefaultExample && !example) return;\n\n    if (Array.isArray(nodes)) {\n      for (const ds of nodes) {\n        if (ds) {\n          const exampleNodes = Array.isArray(ds) ? ds : [ds];\n          BitUtils.fillStringExample(\n            context.textFormat,\n            exampleNodes,\n            __isDefaultExample,\n            example,\n            false,\n          );\n        }\n      }\n    }\n  }\n\n  private pushExampleDownTreeBodyBits(\n    context: BuildContext,\n    __isDefaultExample: boolean | undefined,\n    example: ExampleJson | undefined,\n    body: Body | undefined,\n  ): void {\n    if (!__isDefaultExample && !example) return;\n    const bodyBitsJson = this.textParser.extractBodyBits(body?.body as TextAst);\n\n    for (const part of bodyBitsJson) {\n      if (part) {\n        switch (part.type) {\n          case BodyBitType.gap: {\n            const gap = part as GapJson;\n            BitUtils.fillStringExample(\n              context.textFormat,\n              [gap],\n              __isDefaultExample,\n              example,\n              false,\n            );\n            break;\n          }\n          case BodyBitType.mark: {\n            const mark = part as MarkJson;\n            BitUtils.fillBooleanExample([mark], __isDefaultExample, example, false);\n            break;\n          }\n          case BodyBitType.select: {\n            const select = part as SelectJson;\n            BitUtils.fillBooleanExample(select.options, __isDefaultExample, example, true);\n            break;\n          }\n          case BodyBitType.highlight: {\n            const highlight = part as HighlightJson;\n            BitUtils.fillBooleanExample(highlight.texts, __isDefaultExample, example, true);\n            break;\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Push a value down the tree, without overriding existing values\n   *\n   * This function is not type safe and should be used with care\n   *\n   * @param body/body[] set if the value should be passed down the body to the body bits / card body bits\n   * @param bodyBitTypes body bit types to push the value down to\n   * @param cardNode set if the value should be passed down the card node\n   * @param path path for the value\n   * @param value the value to push down\n   */\n  private pushDownTree(\n    _context: BuildContext,\n    body: Body | CardBit | undefined | (Body | CardBit | undefined)[],\n    bodyBitTypes: BodyBitTypeType[] | undefined,\n    cardNode: CardNode | undefined,\n    cardNodePath: string | string[] | undefined,\n    path: string,\n    value: unknown,\n  ): void {\n    if (value === undefined) return;\n\n    // Add value to card nodes if required\n    if (cardNode && cardNodePath) {\n      if (!Array.isArray(cardNodePath)) cardNodePath = [cardNodePath];\n\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const data = ObjectUtils.flatMapPath(cardNode, cardNodePath) as any[];\n\n      for (const d of data) {\n        if (d[path] == null) {\n          d[path] = value;\n        }\n      }\n    }\n\n    // Add value to body bit types if required\n    if (body) {\n      const bodyArray: Body[] = (Array.isArray(body) ? body : [body]) as Body[];\n      for (const b of bodyArray) {\n        if (b && b.body && bodyBitTypes) {\n          const bodyBitsJson = this.textParser.extractBodyBits(b.body as TextAst);\n\n          if (bodyBitTypes && bodyBitsJson && bodyBitsJson.length > 0) {\n            for (const part of bodyBitsJson) {\n              if (part) {\n                if (bodyBitTypes.indexOf(part.type as BodyBitTypeType) !== -1) {\n                  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                  const data = part as any;\n                  if (data[path] == null) {\n                    data[path] = value;\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n\n  private parseExtraProperties(\n    extraProperties: { [key: string]: unknown } | undefined,\n  ): ExtraProperties | undefined {\n    if (!extraProperties) return undefined;\n\n    const entries = Object.entries(extraProperties);\n    if (entries.length === 0) return undefined;\n\n    const res: ExtraProperties = {};\n\n    for (const [key, value] of entries) {\n      res[key] = (ArrayUtils.asArray(value) || [value]) as Property;\n    }\n\n    return res;\n  }\n\n  /**\n   * Set the 'isExample' flags on the bit\n   *\n   * The flag is set if the bit has an example. The flag is set at each branch level up the tree from\n   * where the 'example' exists.\n   *\n   * @param bit\n   */\n  private setIsExampleFlags(bit: Bit) {\n    // bit.isExample = false;\n\n    const checkIsExample = (example: WithExampleJson): boolean => {\n      if (!example) return false;\n\n      if (/*example.__isDefaultExample ||*/ example.isExample || example.example != undefined) {\n        example.isExample = true;\n        bit.isExample = true;\n      } else {\n        if (example === bit) {\n          example.isExample = !!bit.isExample;\n        } else {\n          example.isExample = false;\n        }\n      }\n      return example.isExample;\n    };\n\n    const { body, cardNode } = bit;\n\n    // Body bit level\n    const bodyBitsJson = this.textParser.extractBodyBits(body?.body as TextAst);\n\n    for (const bodyPart of bodyBitsJson) {\n      switch (bodyPart.type) {\n        case BodyBitType.gap:\n        case BodyBitType.mark: {\n          checkIsExample(bodyPart as WithExampleJson);\n          break;\n        }\n\n        case BodyBitType.select: {\n          const select = bodyPart as SelectJson;\n          let hasExample = false;\n          for (const option of select.options) {\n            hasExample = checkIsExample(option as WithExampleJson) ? true : hasExample;\n          }\n          select.isExample = hasExample;\n          break;\n        }\n\n        case BodyBitType.highlight: {\n          const highlight = bodyPart as HighlightJson;\n          let hasExample = false;\n          for (const text of highlight.texts) {\n            hasExample = checkIsExample(text as WithExampleJson) ? true : hasExample;\n          }\n          highlight.isExample = hasExample;\n          break;\n        }\n      }\n    }\n\n    // Card level\n\n    if (cardNode) {\n      // flashcards\n      for (const v of cardNode.flashcards || []) {\n        checkIsExample(v as WithExampleJson);\n      }\n\n      // definitions\n      for (const v of cardNode.definitions || []) {\n        checkIsExample(v as WithExampleJson);\n      }\n\n      // pairs\n      for (const v of cardNode.pairs || []) {\n        checkIsExample(v as WithExampleJson);\n      }\n      // matrix\n      for (const mx of cardNode.matrix || []) {\n        let hasExample = false;\n\n        // matrix cell\n        for (const v of mx.cells || []) {\n          hasExample = checkIsExample(v as WithExampleJson) ? true : hasExample;\n        }\n        mx.isExample = hasExample;\n      }\n      // quizzes\n      for (const quiz of cardNode.quizzes || []) {\n        let hasExample = false;\n\n        // responses\n        for (const v of quiz.responses || []) {\n          hasExample = checkIsExample(v as WithExampleJson) ? true : hasExample;\n        }\n        // choices\n        for (const v of quiz.choices || []) {\n          hasExample = checkIsExample(v as WithExampleJson) ? true : hasExample;\n        }\n        quiz.isExample = hasExample;\n      }\n      // responses\n      for (const v of cardNode.responses || []) {\n        checkIsExample(v as WithExampleJson);\n      }\n      // choices\n      for (const v of cardNode.choices || []) {\n        checkIsExample(v as WithExampleJson);\n      }\n      // statements\n      for (const v of cardNode.statements || []) {\n        checkIsExample(v as WithExampleJson);\n      }\n      // statement\n      checkIsExample(cardNode.statement as WithExampleJson);\n      // NO: elements\n      // questions\n      for (const v of cardNode.questions || []) {\n        checkIsExample(v as WithExampleJson);\n      }\n    }\n\n    // Bit level\n\n    // statement\n    checkIsExample(bit.statement as WithExampleJson);\n    // responses\n    for (const v of bit.responses || []) {\n      checkIsExample(v as WithExampleJson);\n    }\n    // choices\n    for (const v of bit.choices || []) {\n      checkIsExample(v as WithExampleJson);\n    }\n\n    // Bit itself\n    checkIsExample(bit as WithExampleJson);\n  }\n\n  private setDefaultBitValues(bit: Bit) {\n    const { bitType } = bit;\n    // Set aiGenerated == true for all AI generated bits\n    switch (bitType) {\n      case BitType.articleAi:\n      case BitType.noteAi:\n      case BitType.summaryAi:\n        bit.aiGenerated = this.toAstProperty(\n          bitType,\n          ConfigKey.property_aiGenerated,\n          true,\n          undefined,\n        );\n        break;\n    }\n  }\n\n  private addVersionToParserInfo(bit: Bit) {\n    const parser: ParserInfo = bit.parser ?? {};\n    parser.version = env.appVersion.full;\n    bit.parser = parser;\n  }\n}\n\nexport { Builder };\n","import { type EnumType } from '@ncoderz/superenum';\n\n/**\n * The location of text.\n *\n * The location of the text affects how breakscaping is applied.\n */\nconst TextLocation = {\n  tag: 'tag',\n  body: 'body',\n} as const;\n\nexport type TextLocationType = EnumType<typeof TextLocation>;\n\nexport { TextLocation };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst BodyTextFormat = {\n  plainText: 'text', // plain text\n  latex: 'latex', // LaTeX code\n  json: 'json', // json\n  xml: 'xml', // xml\n\n  // bitmark++ text\n  bitmarkPlusPlus: 'bitmark++',\n} as const;\n\nexport type BodyTextFormatType = EnumType<typeof BodyTextFormat>;\n\nexport { BodyTextFormat };\n","/**\n * Centralized regex and replacer constants for breakscape and unbreakscape.\n * Extracted from breakscape-regex.ts to simplify core logic.\n */\n\nexport const REGEX_MARKS = /([*`_!=])(?=\\1)/; // BM_TAG: $1^  --BODY: $1^  ++BODY: $1^\nexport const REGEX_BLOCKS = /^(\\|)(code[\\s]*|code:|image:|[\\s]*$)/; // ++BODY: $2^$3\nexport const REGEX_TITLE_BLOCKS = /^([#]{1,3})([^\\S\\r\\n]+)/; // ++BODY: $4^$5\nexport const REGEX_LIST_BLOCKS = /^(•)([0-9]+[iI]*|[a-zA-Z]{1}|_|\\+|-|)([^\\S\\r\\n]+)/; // ++BODY: $6^$7$8\nexport const REGEX_START_OF_TAG = /(\\[)([.@#▼►%!?+\\-$_=&])/; // --BODY: $2^$3  ++BODY: $9^$10\nexport const REGEX_FOOTER_DIVIDER = /^(~)(~~~[ \\t]*)$/; // --BODY: $4^$5  ++BODY: $11^$12\nexport const REGEX_PLAIN_TEXT_DIVIDER = /^(\\$)(\\$\\$\\$[ \\t]*)$/; // --BODY: $6^$7  ++BODY: $13^$14\nexport const REGEX_END_OF_TAG = /(\\^*])/; // BM_TAG: ^$2  PLAIN_TAG: ^$1\nexport const REGEX_BIT_START = /^(\\[)(\\^*)(\\.)/; // PLAIN_BODY: $1^$2$3\nexport const REGEX_HATS = /(\\^+)/; // BM_TAG: $3^  PLAIN_TAG: $2^  --BODY: ^$8  ++BODY: $15^  // Must be last\n\nexport const BREAKSCAPE_BITMARK_TAG_REGEX_SOURCE = `${REGEX_MARKS.source}|${REGEX_END_OF_TAG.source}|${REGEX_HATS.source}`;\nexport const BREAKSCAPE_PLAIN_TAG_REGEX_SOURCE = `${REGEX_END_OF_TAG.source}|${REGEX_HATS.source}`;\nexport const BREAKSCAPE_BITMARK_BODY_REGEX_SOURCE = `${REGEX_MARKS.source}|${REGEX_BLOCKS.source}|${REGEX_TITLE_BLOCKS.source}|${REGEX_LIST_BLOCKS.source}|${REGEX_START_OF_TAG.source}|${REGEX_FOOTER_DIVIDER.source}|${REGEX_PLAIN_TEXT_DIVIDER.source}|${REGEX_HATS.source}`;\nexport const BREAKSCAPE_PLAIN_BODY_REGEX_SOURCE = `${REGEX_BIT_START.source}`;\n\nexport const BREAKSCAPE_BITMARK_TAG_REGEX = new RegExp(BREAKSCAPE_BITMARK_TAG_REGEX_SOURCE, 'gm');\nexport const BREAKSCAPE_BITMARK_TAG_REGEX_REPLACER = '$1$3^$2';\n\nexport const BREAKSCAPE_PLAIN_TAG_REGEX = new RegExp(BREAKSCAPE_PLAIN_TAG_REGEX_SOURCE, 'gm');\nexport const BREAKSCAPE_PLAIN_TAG_REGEX_REPLACER = '$2^$1';\n\nexport const BREAKSCAPE_BITMARK_BODY_REGEX = new RegExp(BREAKSCAPE_BITMARK_BODY_REGEX_SOURCE, 'gm');\nexport const BREAKSCAPE_BITMARK_BODY_REGEX_REPLACER = '$1$2$4$6$9$11$13$15^$3$5$7$8$10$12$14';\n\nexport const BREAKSCAPE_PLAIN_BODY_REGEX = new RegExp(BREAKSCAPE_PLAIN_BODY_REGEX_SOURCE, 'gm');\nexport const BREAKSCAPE_PLAIN_BODY_REGEX_REPLACER = '$1^$2$3';\n\nexport const BREAKSCAPE_V2_BODY_REGEX = new RegExp('^(?:(\\\\[)(\\\\^*)(\\\\.))|(\\\\^+)', 'gm');\nexport const BREAKSCAPE_V2_BODY_REGEX_REPLACER = '$1$4^$2$3';\n\nexport const UNBREAKSCAPE_REGEX = new RegExp('\\\\^([\\\\^]*)', 'gm');\nexport const UNBREAKSCAPE_REGEX_REPLACER = '$1';\n\nexport const UNBREAKSCAPE_PLAIN_IN_BODY_REGEX = new RegExp('^(\\\\[)\\\\^(\\\\^*)(\\\\.)', 'gm');\nexport const UNBREAKSCAPE_PLAIN_IN_BODY_REGEX_REPLACER = '$1$2$3';\n\nexport const BREAKSCAPE_CODE_REGEX = new RegExp('^(\\\\||•|#)', 'gm');\nexport const BREAKSCAPE_CODE_REGEX_REPLACER = '$1^';\n","/**\n *  breakscape.ts\n *  ------------------------------------------------------------\n *  Breakscaping for bitmark text.\n *  (c) 2025 — MIT / public domain\n */\n\nimport { PACKAGE_INFO } from '../generated/package_info.ts';\nimport { BodyTextFormat, type BodyTextFormatType } from '../model/enum/BodyTextFormat.ts';\nimport { TextLocation, type TextLocationType } from '../model/enum/TextLocation.ts';\nimport type { BreakscapeOptions } from './BreakscapeOptions.ts';\nimport * as RC from './RegexConfigs.ts';\n\n// default options\nconst DEF = {\n  format: BodyTextFormat.bitmarkPlusPlus,\n  location: TextLocation.body,\n  v2: false,\n} as const;\n\n/**\n * Check if an object is a string.\n *\n * @param obj - The object to check.\n * @returns true if the object is a string, otherwise false.\n */\nfunction isString(obj: unknown): boolean {\n  return typeof obj === 'string' || obj instanceof String;\n}\n\n/**\n * For breakscaping, select the correct regex and replacer for the text format, location, and v2 flag.\n */\nfunction selectBreakscapeRegexAndReplacer(\n  textFormat: BodyTextFormatType,\n  textLocation: TextLocationType,\n  v2 = false,\n): { regex: RegExp; replacer: string } {\n  if (textLocation === TextLocation.tag) {\n    if (!v2 && textFormat === BodyTextFormat.bitmarkPlusPlus) {\n      return {\n        regex: RC.BREAKSCAPE_BITMARK_TAG_REGEX,\n        replacer: RC.BREAKSCAPE_BITMARK_TAG_REGEX_REPLACER,\n      };\n    }\n    return {\n      regex: RC.BREAKSCAPE_PLAIN_TAG_REGEX,\n      replacer: RC.BREAKSCAPE_PLAIN_TAG_REGEX_REPLACER,\n    };\n  } else {\n    if (textFormat === BodyTextFormat.bitmarkPlusPlus) {\n      if (v2) {\n        return {\n          regex: RC.BREAKSCAPE_V2_BODY_REGEX,\n          replacer: RC.BREAKSCAPE_V2_BODY_REGEX_REPLACER,\n        };\n      }\n      return {\n        regex: RC.BREAKSCAPE_BITMARK_BODY_REGEX,\n        replacer: RC.BREAKSCAPE_BITMARK_BODY_REGEX_REPLACER,\n      };\n    }\n    return {\n      regex: RC.BREAKSCAPE_PLAIN_BODY_REGEX,\n      replacer: RC.BREAKSCAPE_PLAIN_BODY_REGEX_REPLACER,\n    };\n  }\n}\n\n/**\n * For unbreakscaping, select the correct regex and replacer for the text format and location.\n */\nfunction selectUnbreakscapeRegexAndReplacer(\n  textFormat: BodyTextFormatType,\n  textLocation: TextLocationType,\n): { regex: RegExp; replacer: string } {\n  const isPlain = textFormat !== BodyTextFormat.bitmarkPlusPlus;\n  if (textLocation === TextLocation.body && isPlain) {\n    return {\n      regex: RC.UNBREAKSCAPE_PLAIN_IN_BODY_REGEX,\n      replacer: RC.UNBREAKSCAPE_PLAIN_IN_BODY_REGEX_REPLACER,\n    };\n  }\n  return {\n    regex: RC.UNBREAKSCAPE_REGEX,\n    replacer: RC.UNBREAKSCAPE_REGEX_REPLACER,\n  };\n}\n\n// -----------------------------------------------------------------------------\n//  ╭──────────────────────────────────────────────────────────────────────────╮\n//  │ 2.  PUBLIC  API                                                         │\n//  ╰──────────────────────────────────────────────────────────────────────────╯\nclass Breakscape {\n  public readonly EMPTY_STRING = '' as string;\n\n  /**\n   * Escapes special characters in bitmark text by adding caret (^) characters.\n   *\n   * This method processes text to prevent special characters from being interpreted\n   * as bitmark markup. It handles various scenarios including:\n   * - Tag triggers after '[' characters\n   * - Paired punctuation marks\n   * - Hat characters (^)\n   * - End-of-tag brackets\n   * - Beginning-of-line markers\n   *\n   * IMPORTANT: Breakscaping differs depending on the bit text format, and if the text will\n   * be used in a tag or in the body of a bitmark. The default is bitmark++ in the body.\n   * If the text is to be used in a tag, or is not bitmark++, you must specify the textFormat\n   * and textLocation options.\n   *\n   * @param val - The input to breakscape. Can be a string, array of strings, null, or undefined.\n   * @param opts - Optional configuration for the breakscape operation.\n   * @returns The breakscaped result with the same type as the input.\n   *\n   * @example\n   * ```typescript\n   * const breakscape = new Breakscape();\n   *\n   * // Single string\n   * breakscape.breakscape('[.hello]'); // Returns '[^.hello]'\n   *\n   * // Array of strings\n   * breakscape.breakscape(['[.hello]', '[.world]']); // Returns ['[^.hello]', '[^.world]']\n   *\n   * // With options\n   * breakscape.breakscape('[.hello]', {\n   *   textFormat: TextFormat.bitmark++,\n   *   textLocation: TextLocation.body\n   * });\n   * ```\n   */\n  breakscape(val: string, opts?: BreakscapeOptions): string;\n  breakscape(val: string[], opts?: BreakscapeOptions): string[];\n  breakscape(val: undefined | null, opts?: BreakscapeOptions): undefined;\n  breakscape(\n    val: string | string[] | undefined | null,\n    opts: BreakscapeOptions = {},\n  ): string | string[] | undefined {\n    if (val == null) return undefined;\n    const options = Object.assign({}, DEF, opts);\n    if (Array.isArray(val)) {\n      return val.map((v) => this.breakscape(v, options)) as string[];\n    }\n\n    // If an unrecognized type is passed, return it as is (e.g. true, false, 0, 1, etc.)\n    if (!isString(val)) return val as string | undefined;\n\n    const { regex, replacer } = selectBreakscapeRegexAndReplacer(\n      options.format,\n      options.location,\n      options.v2,\n    );\n    let str = val;\n    str = str.replace(regex, replacer);\n    return str;\n  }\n\n  /**\n   * Unbreakscape a string or an array of strings.\n   * If the input is an array, a new array will be returned.\n   *\n   * @param val input value\n   * @param opts options for unbreakscaping\n   * @returns the input value with any strings unbreakscaped.\n   */\n  unbreakscape(val: string, opts?: BreakscapeOptions): string;\n  unbreakscape(val: string[], opts?: BreakscapeOptions): string[];\n  unbreakscape(val: undefined | null, opts?: BreakscapeOptions): undefined;\n  unbreakscape(\n    val: string | string[] | undefined | null,\n    opts: BreakscapeOptions = {},\n  ): string | string[] | undefined {\n    if (val == null) return undefined;\n    const options = Object.assign({}, DEF, opts);\n    if (Array.isArray(val)) {\n      return val.map((v) => this.unbreakscape(v, options)) as string[];\n    }\n\n    // If an unrecognized type is passed, return it as is (e.g. true, false, 0, 1, etc.)\n    if (!isString(val)) return val as string | undefined;\n\n    const { regex, replacer } = selectUnbreakscapeRegexAndReplacer(\n      options.format,\n      options.location,\n    );\n    let str = val;\n    str = str.replace(regex, replacer);\n    return str;\n  }\n\n  /**\n   * Breakscape a code string or an array of code strings.\n   * If the input is an array, a new array will be returned.\n   *\n   * @param val input value\n   * @param modifyArray if true, the original array will be modified rather than a copy being made\n   * @returns the input value with any strings breakscaped\n   */\n  public breakscapeCode<T extends unknown | unknown[] | undefined>(\n    val: T,\n    options?: BreakscapeOptions,\n  ): T extends string ? string : T extends string[] ? string[] : undefined {\n    type R = T extends string ? string : T extends string[] ? string[] : undefined;\n\n    if (val == null) return val as unknown as R;\n\n    const opts = Object.assign({}, DEF, options);\n\n    const breakscapeStr = (str: string) => {\n      if (!str) return str;\n      return str.replace(RC.BREAKSCAPE_CODE_REGEX, RC.BREAKSCAPE_CODE_REGEX_REPLACER);\n    };\n\n    if (Array.isArray(val)) {\n      const newVal: unknown[] = opts.inPlaceArray ? val : [val.length];\n      for (let i = 0, len = val.length; i < len; i++) {\n        const v = val[i];\n        if (isString(v)) {\n          val[i] = breakscapeStr(v);\n        }\n      }\n      val = newVal as T;\n    } else if (isString(val)) {\n      val = breakscapeStr(val as string) as T;\n    }\n\n    return val as unknown as R;\n  }\n\n  /**\n   * Gets the version of the breakscape library.\n   *\n   * @returns The current version string of the library.\n   *\n   * @example\n   * ```typescript\n   * const breakscape = new Breakscape();\n   * console.log(breakscape.version()); // e.g., \"1.0.0\"\n   * ```\n   */\n  version(): string {\n    return PACKAGE_INFO.version;\n  }\n\n  /**\n   * Gets the license information for the breakscape library.\n   *\n   * @returns The license string for the library.\n   *\n   * @example\n   * ```typescript\n   * const breakscape = new Breakscape();\n   * console.log(breakscape.license()); // e.g., \"MIT\"\n   * ```\n   */\n  license(): string {\n    return PACKAGE_INFO.license;\n  }\n}\n\nexport { Breakscape };\n","import { type BreakscapedString } from '../model/ast/BreakscapedString.ts';\nimport { TextFormat } from '../model/enum/TextFormat.ts';\nimport { TextLocation } from '../model/enum/TextLocation.ts';\nimport { type BreakscapeOptions } from './BreakscapeOptions.ts';\nimport { Breakscape as BreakscapeImpl } from './BreakscapeRegex.ts';\n\n/**\n * Utility class for breakscaping strings.\n *\n * For the implementation of breakscaping, see:\n * https://github.com/getMoreBrain/bitmark-breakscape\n *\n */\n\nconst DEFAULT_BREAKSCAPE_OPTIONS: BreakscapeOptions = {\n  format: TextFormat.bitmarkText,\n  location: TextLocation.body,\n  inPlaceArray: false,\n  v2: false,\n};\n\nconst externalBreakscape = new BreakscapeImpl();\n\nclass Breakscape {\n  public readonly EMPTY_STRING = '' as BreakscapedString;\n\n  /**\n   * Breakscape a string or an array of strings.\n   * If the input is an array, a new array will be returned.\n   *\n   * @param val input value\n   * @param options options for breakscaping\n   * @param modifyArray\n   * @returns the input value with any strings breakscaped.\n   */\n  public breakscape<T extends string | string[] | undefined>(\n    val: T,\n    options: BreakscapeOptions,\n  ): T extends string ? BreakscapedString : T extends string[] ? BreakscapedString[] : undefined {\n    type R = T extends string\n      ? BreakscapedString\n      : T extends string[]\n        ? BreakscapedString[]\n        : undefined;\n\n    const opts = Object.assign({}, DEFAULT_BREAKSCAPE_OPTIONS, options);\n\n    return externalBreakscape.breakscape(val as BreakscapedString, {\n      format: opts.format,\n      location: opts.location,\n      inPlaceArray: opts.inPlaceArray,\n      v2: opts.v2,\n    }) as R;\n  }\n\n  /**\n   * Unbreakscape a string or an array of strings.\n   * If the input is an array, a new array will be returned.\n   *\n   * @param val input value\n   * @param modifyArray if true, the original array will be modified rather than a copy being made\n   * @returns the input value with any strings unbreakscaped.\n   */\n  public unbreakscape<T extends BreakscapedString | BreakscapedString[] | undefined>(\n    val: T,\n    options: BreakscapeOptions,\n  ): T extends BreakscapedString ? string : T extends BreakscapedString[] ? string[] : undefined {\n    type R = T extends BreakscapedString\n      ? string\n      : T extends BreakscapedString[]\n        ? string[]\n        : undefined;\n\n    const opts = Object.assign({}, DEFAULT_BREAKSCAPE_OPTIONS, options);\n\n    return externalBreakscape.unbreakscape(val as BreakscapedString, opts) as R;\n  }\n\n  /**\n   * Breakscape a code string or an array of code strings.\n   * If the input is an array, a new array will be returned.\n   *\n   * @param val input value\n   * @param modifyArray if true, the original array will be modified rather than a copy being made\n   * @returns the input value with any strings breakscaped\n   */\n  public breakscapeCode<T extends unknown | unknown[] | undefined>(\n    val: T,\n    options?: BreakscapeOptions,\n  ): T extends string ? BreakscapedString : T extends string[] ? BreakscapedString[] : undefined {\n    type R = T extends string\n      ? BreakscapedString\n      : T extends string[]\n        ? BreakscapedString[]\n        : undefined;\n\n    const opts = Object.assign({}, DEFAULT_BREAKSCAPE_OPTIONS, options);\n\n    return externalBreakscape.breakscapeCode(val as BreakscapedString, opts) as R;\n  }\n\n  /**\n   * Concatenate two breakscaped strings.\n   *\n   * @param s1 first string\n   * @param s2 second string\n   * @returns the concatenated string\n   */\n  public concatenate(s1: BreakscapedString, s2: BreakscapedString): BreakscapedString {\n    return (s1 + s2) as BreakscapedString;\n  }\n}\n\nconst instance = new Breakscape();\n\nexport { instance as Breakscape };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst DeprecatedTextFormat = {\n  bitmarkMinusMinus: 'bitmark--', // bitmark-- text format, deprecated\n} as const;\n\nexport type DeprecatedTextFormatType = EnumType<typeof DeprecatedTextFormat>;\n\nexport { DeprecatedTextFormat };\n","import { Config } from '../../config/Config.ts';\nimport { BitType, type BitTypeType } from '../../model/enum/BitType.ts';\nimport type {\n  TableCellJson,\n  TableExtendedJson,\n  TableJson,\n  TableSectionJson,\n} from '../../model/json/BitJson.ts';\n\n/**\n * Type guard to check if table uses old format (columns/data)\n * @param table - Table JSON to check\n * @returns true if table uses old format\n */\nexport function isTableBasicFormat(table: TableJson | TableExtendedJson): boolean {\n  const t = table as TableJson & TableExtendedJson;\n  return !!(t.columns || t.data) && !(t.header || t.body || t.footer);\n}\n\n/**\n * Type guard to check if table uses new format (head/body/foot)\n * @param table - Table JSON to check\n * @returns true if table uses new format\n */\nexport function isTableExtendedFormat(table: TableJson | TableExtendedJson): boolean {\n  const t = table as TableJson & TableExtendedJson;\n  return !!(t.header || t.body || t.footer);\n}\n\n/**\n * Type guard to check if table uses mixed format (has both old and new fields)\n * @param table - Table JSON to check\n * @returns true if table has both old and new format fields\n */\nexport function isMixedTableFormat(table: TableJson | TableExtendedJson): boolean {\n  const t = table as TableJson & TableExtendedJson;\n  const hasOld = !!(t.columns || t.data);\n  const hasNew = !!(t.header || t.body || t.footer);\n  return hasOld && hasNew;\n}\n\n/**\n * Convert old table format (columns/data) to new format (head/body/foot)\n * @param table - Table in basic format\n * @returns Table in new format\n */\nexport function convertBasicToExtendedTableFormat(table: TableJson): TableExtendedJson {\n  const tableExtended: TableExtendedJson = {};\n\n  // Convert columns to table-header\n  if (table.columns && table.columns.length > 0) {\n    tableExtended.header = {\n      rows: [\n        {\n          cells: table.columns.map((col) => ({\n            content: col,\n            title: true,\n          })),\n        },\n      ],\n    };\n  }\n\n  // Convert data to body\n  if (table.data && table.data.length > 0) {\n    tableExtended.body = {\n      rows: table.data.map((row) => ({\n        cells: row.map((cell) => ({\n          content: cell,\n        })),\n      })),\n    };\n  }\n\n  // Apply columnWidths to header (preferred) or first body row\n  if (Array.isArray(table.columnWidths) && table.columnWidths.length > 0) {\n    const targetCells = tableExtended.header?.rows[0]?.cells ?? tableExtended.body?.rows[0]?.cells;\n    if (targetCells) {\n      for (let i = 0; i < table.columnWidths.length; i++) {\n        const width = table.columnWidths[i];\n        if (typeof width === 'number' && width > 0 && targetCells[i]) {\n          targetCells[i].colwidth = width;\n        }\n      }\n    }\n  }\n\n  return tableExtended;\n}\n\n/**\n * Convert extended table format (header/body/footer) to basic format (columns/data)\n * @param table - Table in extended format\n * @returns Table in basic format\n */\nexport function convertExtendedToBasicTableFormat(tableExtended: TableExtendedJson): TableJson {\n  const table = {} as TableJson;\n\n  type LegacyRow = TableCellJson['content'][];\n\n  const extractRowCells = (row: TableSectionJson['rows'][number] | undefined): LegacyRow => {\n    if (!row || !Array.isArray(row.cells)) {\n      return [];\n    }\n\n    return row.cells\n      .map((cell) => cell?.content)\n      .filter((content): content is TableCellJson['content'] => content !== undefined);\n  };\n\n  const dataRows: LegacyRow[] = [];\n\n  // Aggregate column widths across all rows; later writes override earlier.\n  const widths: (number | null)[] = [];\n  let hasAnyWidth = false;\n  let maxCellCount = 0;\n\n  const collectWidths = (cells: TableCellJson[] | undefined): void => {\n    if (!cells) return;\n    if (cells.length > maxCellCount) maxCellCount = cells.length;\n    cells.forEach((cell, idx) => {\n      if (cell && typeof cell.colwidth === 'number' && cell.colwidth > 0) {\n        widths[idx] = cell.colwidth;\n        hasAnyWidth = true;\n      }\n    });\n  };\n\n  const headRows = tableExtended.header?.rows ?? [];\n  headRows.forEach((row) => collectWidths(row?.cells));\n  (tableExtended.body?.rows ?? []).forEach((row) => collectWidths(row?.cells));\n  (tableExtended.footer?.rows ?? []).forEach((row) => collectWidths(row?.cells));\n\n  if (headRows.length > 0) {\n    const primaryHeader = extractRowCells(headRows[0]);\n\n    if (primaryHeader.length > 0) {\n      table.columns = primaryHeader;\n    }\n\n    const remainingHeadRows = headRows.slice(1);\n    remainingHeadRows.forEach((row) => {\n      const cells = extractRowCells(row);\n      if (cells.length > 0) {\n        dataRows.push(cells);\n      }\n    });\n  }\n\n  const appendSectionRows = (section: TableSectionJson | undefined): void => {\n    if (!section || !Array.isArray(section.rows)) {\n      return;\n    }\n\n    section.rows.forEach((row) => {\n      const cells = extractRowCells(row);\n      if (cells.length > 0) {\n        dataRows.push(cells);\n      }\n    });\n  };\n\n  appendSectionRows(tableExtended.body);\n  appendSectionRows(tableExtended.footer);\n\n  if (dataRows.length > 0) {\n    table.data = dataRows;\n  }\n\n  if (hasAnyWidth) {\n    const columnCount = table.columns?.length ?? maxCellCount;\n    const columnWidths: (number | null)[] = new Array(columnCount).fill(null);\n    for (let i = 0; i < columnCount; i++) {\n      const w = widths[i];\n      if (typeof w === 'number') columnWidths[i] = w;\n    }\n    table.columnWidths = columnWidths;\n  }\n\n  return table;\n}\n\n/**\n * Validate TableCellJson properties\n * @param cell - Table cell to validate\n * @returns Array of validation error messages (empty if valid)\n */\nexport function validateTableCell(cell: TableCellJson): string[] {\n  const errors: string[] = [];\n\n  // Validate content exists\n  if (!cell.content) {\n    errors.push('Cell content is required');\n  }\n\n  // Validate rowspan\n  if (cell.rowspan !== undefined) {\n    if (!Number.isInteger(cell.rowspan) || cell.rowspan < 1) {\n      errors.push('rowspan must be an integer >= 1');\n    }\n  }\n\n  // Validate colspan\n  if (cell.colspan !== undefined) {\n    if (!Number.isInteger(cell.colspan) || cell.colspan < 1) {\n      errors.push('colspan must be an integer >= 1');\n    }\n  }\n\n  // Validate scope\n  if (cell.scope !== undefined) {\n    const validScopes = ['row', 'col', 'rowgroup', 'colgroup'];\n    if (!validScopes.includes(cell.scope)) {\n      errors.push(`scope must be one of: ${validScopes.join(', ')}`);\n    }\n  }\n\n  return errors;\n}\n\n/**\n * Validate TableSectionJson structure\n * @param section - Table section to validate\n * @returns Array of validation error messages (empty if valid)\n */\nexport function validateTableSection(section: TableSectionJson): string[] {\n  const errors: string[] = [];\n\n  if (!section.rows) {\n    errors.push('Section must have rows array');\n    return errors;\n  }\n\n  if (!Array.isArray(section.rows)) {\n    errors.push('Section rows must be an array');\n    return errors;\n  }\n\n  // Validate each row\n  section.rows.forEach((row, rowIndex) => {\n    if (!row.cells || !Array.isArray(row.cells)) {\n      errors.push(`Row ${rowIndex}: cells must be an array`);\n      return;\n    }\n\n    // Validate each cell\n    row.cells.forEach((cell, cellIndex) => {\n      const cellErrors = validateTableCell(cell);\n      cellErrors.forEach((err) => {\n        errors.push(`Row ${rowIndex}, Cell ${cellIndex}: ${err}`);\n      });\n    });\n  });\n\n  return errors;\n}\n\n/**\n * Validate TableJson structure\n * @param table - Table to validate\n * @returns Array of validation error messages (empty if valid)\n */\nexport function validateTable(table: TableJson | TableExtendedJson): string[] {\n  const errors: string[] = [];\n  const t = table as TableJson & TableExtendedJson;\n\n  // Check if table has any data\n  const hasOld = !!(t.columns || t.data);\n  const hasNew = !!(t.header || t.body || t.footer);\n\n  if (!hasOld && !hasNew) {\n    errors.push('Table must have either old format (columns/data) or new format (head/body/foot)');\n    return errors;\n  }\n\n  // Validate new format sections\n  if (t.header) {\n    const headErrors = validateTableSection(t.header);\n    headErrors.forEach((err) => errors.push(`head: ${err}`));\n  }\n\n  if (t.body) {\n    const bodyErrors = validateTableSection(t.body);\n    bodyErrors.forEach((err) => errors.push(`body: ${err}`));\n  }\n\n  if (t.footer) {\n    const footErrors = validateTableSection(t.footer);\n    footErrors.forEach((err) => errors.push(`foot: ${err}`));\n  }\n\n  return errors;\n}\n\n/**\n * Normalize table to new format if it uses old format\n * @param table - Table in either format\n * @returns Table in new format\n */\nexport function normalizeTableFormat(\n  bitType: BitTypeType,\n  table: TableJson | TableExtendedJson,\n): TableJson | TableExtendedJson {\n  // If mixed format, new takes precedence (ignore old)\n  if (isMixedTableFormat(table)) {\n    const t = table as Partial<TableJson> & TableExtendedJson;\n    delete t.columns;\n    delete t.data;\n  }\n\n  const isExtended =\n    Config.isOfBitType(bitType, BitType.tableExtended) ||\n    Config.isOfBitType(bitType, BitType.tableImage);\n\n  // If old format only, but .table-extended bit, convert to new\n  if (isExtended && isTableBasicFormat(table)) {\n    return convertBasicToExtendedTableFormat(table as TableJson);\n  }\n\n  // If new format only, but .table bit, convert to new\n  if (!isExtended && isTableExtendedFormat(table)) {\n    return convertExtendedToBasicTableFormat(table as TableExtendedJson);\n  }\n\n  // Already in correct (new) format\n  return table;\n}\n","class ArrayUtils {\n  /**\n   * Convert a value to an array, unless it is already an array.\n   *\n   * This function is useful for handling parameters that can be a single value or an array of values.\n   *\n   * @param val input value\n   * @returns the input value if it is an array, otherwise a new array containing the input value\n   */\n  asArray<T>(val: T | T[] | undefined): T[] | undefined {\n    if (val == null) return undefined;\n    if (Array.isArray(val)) return val;\n    return [val];\n  }\n\n  /**\n   * Convert an array or value to a value, unless it is already a value.\n   * The first item in the array will be selected\n   *\n   * This function is useful for handling parameters that can be a single value or an array of values.\n   *\n   * @param val input value\n   * @param last if true, the last item in the array will be selected, rather than the first\n   * @returns the input value if it is not an array, otherwise the first item in the array\n   */\n  asSingle<T>(val: T | T[] | undefined, last?: boolean): T | undefined {\n    if (val == null) return undefined;\n    if (Array.isArray(val)) {\n      if (val.length > 0) return last ? val[val.length - 1] : val[0];\n      return undefined;\n    }\n    return val;\n  }\n\n  /**\n   * Removes all duplicate items, keeping the first duplicate only.\n   * The input array is modified in place.\n   *\n   * @param arr array in which to make items unique\n   * @param keyFunc function(item) to return the key to check for equality. - optional\n   * @returns the input array with all duplicate items removed\n   */\n  public removeDuplicates<T>(arr: T[], keyFunc?: (item: T) => unknown): T[] {\n    const seen = new Set<unknown>();\n    let write = 0;\n\n    for (let read = 0; read < arr.length; read++) {\n      const item = arr[read];\n      const k = keyFunc ? keyFunc(item) : (item as unknown);\n\n      if (!seen.has(k)) {\n        seen.add(k);\n        if (write !== read) arr[write] = item;\n        write++;\n      }\n    }\n\n    if (write < arr.length) arr.length = write;\n    return arr;\n  }\n}\n\nconst instance = new ArrayUtils();\n\nexport { instance as ArrayUtils };\n","import { Enum, type EnumType } from '@ncoderz/superenum';\n\nimport { Ast, type NodeInfo } from '../../ast/Ast.ts';\nimport { Breakscape } from '../../breakscaping/Breakscape.ts';\nimport { type BreakscapeOptions } from '../../breakscaping/BreakscapeOptions.ts';\nimport { type BreakscapedString } from '../../model/ast/BreakscapedString.ts';\nimport { type Bit } from '../../model/ast/Nodes.ts';\nimport { NodeType } from '../../model/ast/NodeType.ts';\nimport {\n  type CodeBlockTextNode,\n  type CommentMark,\n  type ExtRefMark,\n  type FootnoteMark,\n  type HeadingTextNode,\n  type ImageInlineTextNode,\n  type ImageTextNode,\n  type LatexTextNode,\n  type LinkMark,\n  type ListTextNode,\n  type MediaAttributes,\n  type RefMark,\n  type SectionTextNode,\n  type SymbolMark,\n  type TaskItemTextNode,\n  type TextAst,\n  type TextMark,\n  type TextNode,\n  type XRefMark,\n} from '../../model/ast/TextNodes.ts';\nimport {\n  BitmarkVersion,\n  type BitmarkVersionType,\n  DEFAULT_BITMARK_VERSION,\n} from '../../model/enum/BitmarkVersion.ts';\nimport { type BitTypeType } from '../../model/enum/BitType.ts';\nimport { TextFormat, type TextFormatType } from '../../model/enum/TextFormat.ts';\nimport { TextLocation, type TextLocationType } from '../../model/enum/TextLocation.ts';\nimport { TextMarkType, type TextMarkTypeType } from '../../model/enum/TextMarkType.ts';\nimport { TextNodeType, type TextNodeTypeType } from '../../model/enum/TextNodeType.ts';\nimport { type BodyBitJson, type BodyBitsJson } from '../../model/json/BodyBitJson.ts';\nimport { StringUtils } from '../../utils/StringUtils.ts';\nimport { AstWalkerGenerator } from '../AstWalkerGenerator.ts';\n\nconst DEFAULT_OPTIONS: TextOptions = {\n  bodyBitCallback: undefined,\n  debugGenerationInline: false,\n};\n\nconst FIRST_PARAGRAPH_CONTENT_DEPTH = 3;\n\nconst BOLD_HALF_MARK = '*';\nconst LIGHT_HALF_MARK = '`';\nconst ITALIC_HALF_MARK = '_';\nconst HIGHLIGHT_HALF_MARK = '!';\nconst INLINE_HALF_MARK = '=';\n\nconst BOLD_MARK = BOLD_HALF_MARK + BOLD_HALF_MARK;\nconst LIGHT_MARK = LIGHT_HALF_MARK + LIGHT_HALF_MARK;\nconst ITALIC_MARK = ITALIC_HALF_MARK + ITALIC_HALF_MARK;\nconst HIGHLIGHT_MARK = HIGHLIGHT_HALF_MARK + HIGHLIGHT_HALF_MARK;\nconst INLINE_MARK = INLINE_HALF_MARK + INLINE_HALF_MARK;\n\nconst ALL_HALF_MARKS = [\n  BOLD_HALF_MARK,\n  LIGHT_HALF_MARK,\n  ITALIC_HALF_MARK,\n  HIGHLIGHT_HALF_MARK,\n  INLINE_HALF_MARK,\n];\n\nconst ALL_TAG_OPENING_ENDS = '@#▼►%!?+-$_=&';\n\nconst HEADING_TAG = '#';\n\nconst STANDARD_MARKS: { [key: string]: string } = {\n  [TextMarkType.bold]: BOLD_MARK,\n  [TextMarkType.light]: LIGHT_MARK,\n  [TextMarkType.italic]: ITALIC_MARK,\n  [TextMarkType.highlight]: HIGHLIGHT_MARK,\n};\n\nconst STANDARD_MARK_TYPES: TextMarkTypeType[] = [\n  TextMarkType.bold,\n  TextMarkType.light,\n  TextMarkType.italic,\n  TextMarkType.highlight,\n];\nconst INLINE_MARK_TYPES: TextMarkTypeType[] = [\n  TextMarkType.highlightOrange,\n  TextMarkType.highlightYellow,\n  TextMarkType.highlightGreen,\n  TextMarkType.highlightBlue,\n  TextMarkType.highlightPurple,\n  TextMarkType.highlightPink,\n  TextMarkType.highlightBrown,\n  TextMarkType.highlightBlack,\n  TextMarkType.highlightWhite,\n  TextMarkType.highlightGray,\n\n  TextMarkType.strike,\n  TextMarkType.subscript,\n  TextMarkType.superscript,\n  TextMarkType.ins,\n  TextMarkType.del,\n  TextMarkType.underline,\n  TextMarkType.doubleUnderline,\n  TextMarkType.smallcaps,\n  TextMarkType.circle,\n  TextMarkType.languageEmRed,\n  TextMarkType.languageEmOrange,\n  TextMarkType.languageEmYellow,\n  TextMarkType.languageEmGreen,\n  TextMarkType.languageEmBlue,\n  TextMarkType.languageEmPurple,\n  TextMarkType.languageEmPink,\n  TextMarkType.languageEmBrown,\n  TextMarkType.languageEmBlack,\n  TextMarkType.languageEmWhite,\n  TextMarkType.languageEmGray,\n  TextMarkType.languageEm,\n  TextMarkType.userUnderline,\n  TextMarkType.userDoubleUnderline,\n  TextMarkType.userStrike,\n  TextMarkType.userCircle,\n  TextMarkType.userHighlight,\n  TextMarkType.notranslate,\n  //\n  TextMarkType.link,\n  TextMarkType.ref,\n  TextMarkType.xref,\n  TextMarkType.extref,\n  TextMarkType.footnote,\n  TextMarkType.footnoteStar,\n  TextMarkType.symbol,\n  TextMarkType.var,\n  TextMarkType.code,\n  TextMarkType.timer,\n  TextMarkType.color, // legacy input, written as color: (same as textStyle)\n  TextMarkType.textStyle,\n  TextMarkType.colorPicker,\n  TextMarkType.comment,\n];\n\n// Valid colors for the highlight|color: / userHighlight|color: compound chains.\n// Must match the HighlightColor rule in text-grammar.pegjs.\nconst HIGHLIGHT_COLORS = [\n  'orange',\n  'yellow',\n  'green',\n  'blue',\n  'purple',\n  'pink',\n  'brown',\n  'white',\n  'black',\n  'gray',\n];\n\n// Regex explanation:\n// - Match newline or carriage return + newline\nconst INDENTATION_REGEX = new RegExp(/(\\n|\\r\\n)/, 'g');\n\nconst LINK_REGEX = new RegExp(/https?:\\/\\/|mailto:(.*)/, 'g');\nconst LINK_BREAKSCAPE_REGEX = new RegExp(/\\]/, 'g');\n\n/**\n * Text generation options\n */\nexport interface TextOptions {\n  /**\n   * Callback for writing text\n   *\n   * If set, the callback will be called, rather than writing to the output string\n   */\n  writeCallback?: WriteCallback;\n\n  /**\n   * Callback for rendering body bits\n   */\n  bodyBitCallback?: BodyBitCallback;\n\n  /**\n   * [development only]\n   * Generate debug information in the output.\n   */\n  debugGenerationInline?: boolean;\n}\n\nexport type GenerateOptions = {\n  plainTextDividerAllowed?: boolean;\n  noBreakscaping?: boolean;\n  forceInline?: boolean;\n  noMarkup?: boolean;\n};\n\nconst Stage = {\n  enter: 'enter',\n  between: 'between',\n  exit: 'exit',\n};\n\nexport type StageType = EnumType<typeof Stage>;\n\nexport type WriteCallback = (s: string) => void;\nexport type BodyBitCallback = (bodyBit: BodyBitJson, index: number, route: NodeInfo[]) => string;\n\ninterface MediaAttributeOptions {\n  ignoreAttributes?: Set<string>;\n}\n\ninterface TextOptionsInternal extends TextOptions {\n  isInternal?: boolean;\n}\n\n/**\n * Generate text from a bitmark text AST\n */\nclass TextGenerator extends AstWalkerGenerator<TextAst, BreakscapedString> {\n  protected ast = new Ast();\n  private bitmarkVersion: BitmarkVersionType;\n  private options: TextOptionsInternal;\n  private internalTextGenerator: TextGenerator | null = null;\n\n  // State\n  private generateOptions: GenerateOptions = {};\n  private textFormat: TextFormatType = TextFormat.bitmarkText;\n  private textLocation: TextLocationType = TextLocation.body;\n  private writerText = '';\n  private nodeIndex = 0;\n  private currentIndent = 0;\n  private prevIndent = 0;\n  private indentationStringCache = '';\n  private inParagraph = false;\n  private inHeading = false;\n  private inCodeBlock = false;\n  private inBulletList = false;\n  private inInline = false;\n  private markDepth = 0;\n  private textDepth = 0;\n  private placeholderIndex = 0;\n  private placeholders: BodyBitsJson = {};\n\n  // For pre-text\n  private rootParagraphNodeContentIndex = 0;\n  private previousRootParagraphContextType: TextNodeTypeType = TextNodeType.text;\n  private inPreText = false;\n  private thisNodeIsPreText = false;\n  private preTextIndexTemp = -1;\n  private havePreText = false;\n  private preTextIndex = -1;\n\n  /**\n   * Generate text from a bitmark text AST\n   *\n   * @param bitmarkVersion - bitmark version, use null to use latest version\n   * @param options - text generation options\n   */\n  constructor(bitmarkVersion?: BitmarkVersionType, options?: TextOptions) {\n    super();\n\n    this.bitmarkVersion = Enum(BitmarkVersion).fromValue(bitmarkVersion) ?? DEFAULT_BITMARK_VERSION;\n    this.options = {\n      ...DEFAULT_OPTIONS,\n      ...options,\n    };\n\n    this.debugGenerationInline = this.options.debugGenerationInline ?? false;\n\n    // Set defaults according to bitmark version\n    if (this.bitmarkVersion === BitmarkVersion.v2) {\n      //\n    } else {\n      //\n    }\n\n    this.enter = this.enter.bind(this);\n    this.between = this.between.bind(this);\n    this.exit = this.exit.bind(this);\n    this.leaf = this.leaf.bind(this);\n\n    // Create internal text generator for parsing nested bitmark text.\n    // Only create if this is not already an internal generator\n    if (!this.options.isInternal) {\n      this.internalTextGenerator = new TextGenerator(bitmarkVersion, {\n        ...this.options,\n        writeCallback: undefined,\n        isInternal: true,\n      } as TextOptionsInternal);\n    }\n  }\n\n  /**\n   * Generate text from a bitmark text AST\n   *\n   * @param ast bitmark text AST\n   */\n  public async generate(\n    ast: TextAst,\n    textFormat: TextFormatType,\n    textLocation: TextLocationType,\n    options?: GenerateOptions,\n  ): Promise<BreakscapedString> {\n    return this.generateSync(ast, textFormat, textLocation, options);\n  }\n\n  /**\n   * Generate text from a bitmark text AST synchronously\n   *\n   * @param ast bitmark text AST\n   */\n  public generateSync(\n    ast: TextAst,\n    textFormat: TextFormatType,\n    textLocation: TextLocationType,\n    options?: GenerateOptions,\n  ): BreakscapedString {\n    // Sanity check\n    if (!ast || !Array.isArray(ast)) return '' as BreakscapedString;\n\n    this.generateOptions = Object.assign({}, options);\n\n    this.validateGenerateOptions(ast);\n\n    if (!this.generateOptions.plainTextDividerAllowed) {\n      // Normal case with no pre-text - need only walk once\n\n      // Reset the state\n      this.resetState(textFormat, textLocation);\n\n      // Walk the text AST - this 1st walk is to determine if there is pre-text\n      this.walkAndWrite(ast);\n    } else {\n      // Plain text divider is allowed. We need to walk the text AST twice:\n      // 1. To determine if there is pre-text\n      // 2. To generate the text\n\n      // Save and clear the write callback / body bit callback for the first walk as we don't want to write the text\n      const writeCallback = this.options.writeCallback;\n      const bodyBitCallback = this.options.bodyBitCallback;\n      this.options.writeCallback = undefined;\n      this.options.bodyBitCallback = undefined;\n\n      // Reset the state\n      this.resetState(textFormat, textLocation);\n\n      // Walk the text AST - this 1st walk is to determine if there is pre-text\n      this.walkAndWrite(ast);\n\n      // Restore the write callback\n      this.options.writeCallback = writeCallback;\n      this.options.bodyBitCallback = bodyBitCallback;\n\n      // Reset the state, preserving havePreText / preTextIndex from the first walk\n      const havePreText = this.havePreText;\n      const pti = this.preTextIndex;\n      this.resetState(textFormat, textLocation);\n      this.havePreText = havePreText;\n      this.preTextIndex = pti;\n\n      // Walk the text AST - this is the 2nd walk to generate the text\n      this.walkAndWrite(ast);\n    }\n\n    return this.writerText as BreakscapedString;\n  }\n\n  public getPlaceholders(): BodyBitsJson {\n    return this.placeholders;\n  }\n\n  private resetState(textFormat: TextFormatType, textLocation: TextLocationType): void {\n    this.printed = false;\n\n    this.textFormat = textFormat ?? TextFormat.bitmarkText;\n    this.textLocation = textLocation;\n    this.writerText = '';\n    this.nodeIndex = 0;\n    this.currentIndent = 0;\n    this.prevIndent = 0;\n    this.indentationStringCache = '';\n    this.inParagraph = false;\n    this.inHeading = false;\n    this.inCodeBlock = false;\n    this.inBulletList = false;\n    this.inInline = false;\n    this.markDepth = 0;\n    this.textDepth = 0;\n    this.placeholderIndex = 0;\n    this.placeholders = {};\n\n    // For pre-text\n    this.rootParagraphNodeContentIndex = 0;\n    this.previousRootParagraphContextType = TextNodeType.hardBreak;\n    this.inPreText = false;\n    this.thisNodeIsPreText = false;\n    this.preTextIndexTemp = -1;\n    this.havePreText = false;\n    this.preTextIndex = -1;\n  }\n\n  private walkAndWrite(ast: TextAst): void {\n    // Walk the bitmark AST\n    this.ast.walk(ast, NodeType.textAst, this, undefined);\n  }\n\n  //\n  // NODE HANDLERS\n  //\n\n  // * -> textAstValue\n\n  protected enter_textAstValue(node: NodeInfo, route: NodeInfo[]): void | false {\n    return this.handleEnterNode(node.value, route);\n  }\n\n  protected between_textAstValue(\n    node: NodeInfo,\n    left: NodeInfo,\n    right: NodeInfo,\n    route: NodeInfo[],\n  ): void | false {\n    return this.handleBetweenNode(node.value, left, right, route);\n  }\n\n  protected exit_textAstValue(node: NodeInfo, route: NodeInfo[]): void | false {\n    return this.handleExitNode(node.value, route);\n  }\n\n  // * -> contentValue\n\n  protected enter_contentValue(node: NodeInfo, route: NodeInfo[]): void | false {\n    return this.handleEnterContentValueNode(node, route);\n  }\n\n  protected between_contentValue(\n    node: NodeInfo,\n    left: NodeInfo,\n    right: NodeInfo,\n    route: NodeInfo[],\n  ): void {\n    this.handleBetweenContentValueNode(node, left, right, route);\n  }\n\n  protected exit_contentValue(node: NodeInfo, route: NodeInfo[]): void | false {\n    this.handleExitContentValueNode(node, route);\n  }\n\n  // * -> contentValueValue\n\n  protected enter_contentValueValue(node: NodeInfo, route: NodeInfo[]): void | false {\n    return this.handleEnterNode(node.value, route);\n  }\n\n  protected between_contentValueValue(\n    node: NodeInfo,\n    left: NodeInfo,\n    right: NodeInfo,\n    route: NodeInfo[],\n  ): void {\n    this.handleBetweenNode(node.value, left, right, route);\n  }\n\n  protected exit_contentValueValue(node: NodeInfo, route: NodeInfo[]): void | false {\n    return this.handleExitNode(node.value, route);\n  }\n\n  // * -> marks\n\n  protected enter_marks(_node: NodeInfo, _route: NodeInfo[]): void | false {\n    this.markDepth++;\n  }\n\n  protected exit_marks(_node: NodeInfo, _route: NodeInfo[]): void | false {\n    this.markDepth--;\n  }\n\n  // END NODE HANDLERS\n\n  protected handleEnterNode(node: TextNode, route: NodeInfo[]): void | false {\n    if (this.markDepth > 0) return; // All marks are handled by themselves\n\n    this.handleEnterNodePreTextCheck(node, route);\n\n    this.handleIndent(node);\n\n    switch (node.type) {\n      case TextNodeType.paragraph:\n        this.inParagraph = true;\n        this.writeParagraph(node, route);\n        break;\n\n      case TextNodeType.hardBreak:\n        this.writeHardBreak(node);\n        break;\n\n      case TextNodeType.text: {\n        this.writeMarks(node, Stage.enter);\n        this.writeText(node);\n        this.writeMarks(node, Stage.between);\n        if (this.textDepth === 0) {\n          this.inInline = true;\n        }\n        this.textDepth++;\n        break;\n      }\n\n      case TextNodeType.heading:\n        this.writeHeading(node as HeadingTextNode);\n        this.inHeading = true;\n        break;\n\n      case TextNodeType.section:\n        this.writeSection(node as SectionTextNode);\n        break;\n\n      case TextNodeType.listItem:\n      case TextNodeType.taskItem:\n        this.writeBullet(node, route);\n        break;\n\n      case TextNodeType.image:\n        this.writeImage(node as ImageTextNode);\n        break;\n\n      case TextNodeType.imageInline:\n        this.writeImage(node as ImageTextNode);\n        break;\n\n      case TextNodeType.codeBlock:\n        this.inCodeBlock = true;\n        this.writeCodeBlock(node as CodeBlockTextNode);\n        break;\n\n      case TextNodeType.latex:\n        this.writeLatex(node as LatexTextNode);\n        break;\n\n      case TextNodeType.noBulletList:\n      case TextNodeType.bulletList:\n      case TextNodeType.orderedList:\n      case TextNodeType.orderedListRoman:\n      case TextNodeType.orderedListRomanLower:\n      case TextNodeType.letteredList:\n      case TextNodeType.letteredListLower:\n      case TextNodeType.taskList:\n        this.inBulletList = true;\n        break;\n\n      case TextNodeType.gap:\n      case TextNodeType.select:\n      case TextNodeType.highlight:\n      case TextNodeType.mark:\n        this.writeBodyBit(node, route);\n        // Stop parsing the body bit\n        return false;\n      default:\n      // Ignore unknown type\n    }\n  }\n\n  protected handleBetweenNode(\n    node: TextNode,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    switch (node.type) {\n      default:\n      // Ignore unknown type\n    }\n  }\n\n  protected handleExitNode(node: TextNode, _route: NodeInfo[]): void | false {\n    if (this.markDepth > 0) return; // All marks are handled by themselves\n\n    switch (node.type) {\n      case TextNodeType.text:\n        this.textDepth--;\n        if (this.textDepth === 0) {\n          this.inInline = false;\n        }\n        this.writeMarks(node, Stage.exit);\n        break;\n\n      case TextNodeType.paragraph:\n        // if (this.textFormat !== TextFormat.bitmarkText) {\n        // Paragraph Block type node, write 1x newline\n        // Except:\n        // - for bitmark-- where we don't write newlines for the single wrapping block\n        this.writeNL();\n        // }\n        this.inParagraph = false;\n        break;\n\n      case TextNodeType.heading:\n        this.inHeading = false;\n\n      case TextNodeType.section:\n      case TextNodeType.image:\n        if (!this.inParagraph) {\n          // Block type nodes, write 2x newline\n          this.writeNL();\n          this.writeNL();\n        }\n        break;\n\n      case TextNodeType.codeBlock:\n        // CodeBlock type node, write 2x newline\n        this.writeNL();\n        this.writeNL();\n        this.inCodeBlock = false;\n        break;\n\n      case TextNodeType.noBulletList:\n      case TextNodeType.bulletList:\n      case TextNodeType.orderedList:\n      case TextNodeType.orderedListRoman:\n      case TextNodeType.orderedListRomanLower:\n      case TextNodeType.letteredList:\n      case TextNodeType.letteredListLower:\n      case TextNodeType.taskList:\n        // List Block type nodes, write a newline only if there is no indent\n        if (this.currentIndent <= 1) {\n          this.writeNL();\n          // Exit 'inBulletList' state only if not in a nested list\n          this.inBulletList = false;\n        }\n        break;\n\n      default:\n      // Ignore unknown type\n    }\n\n    this.handleDedent(node);\n\n    // Increment the node index for the next node\n    this.nodeIndex++;\n  }\n\n  protected handleIndent(node: TextNode) {\n    switch (node.type) {\n      case TextNodeType.noBulletList:\n      case TextNodeType.bulletList:\n      case TextNodeType.orderedList:\n      case TextNodeType.orderedListRoman:\n      case TextNodeType.orderedListRomanLower:\n      case TextNodeType.letteredList:\n      case TextNodeType.letteredListLower:\n      case TextNodeType.taskList:\n        this.currentIndent++;\n        break;\n\n      default:\n      // Ignore unknown type\n    }\n  }\n\n  protected handleDedent(node: TextNode) {\n    switch (node.type) {\n      case TextNodeType.noBulletList:\n      case TextNodeType.bulletList:\n      case TextNodeType.orderedList:\n      case TextNodeType.orderedListRoman:\n      case TextNodeType.orderedListRomanLower:\n      case TextNodeType.letteredList:\n      case TextNodeType.letteredListLower:\n      case TextNodeType.taskList:\n        this.currentIndent--;\n        break;\n\n      default:\n      // Ignore unknown type\n    }\n  }\n\n  protected handleEnterContentValueNode(_node: NodeInfo, route: NodeInfo[]): void | false {\n    if (route.length === FIRST_PARAGRAPH_CONTENT_DEPTH) {\n      this.thisNodeIsPreText = true;\n      this.inPreText = false;\n      this.previousRootParagraphContextType = TextNodeType.hardBreak;\n    }\n  }\n\n  protected handleBetweenContentValueNode(\n    _node: NodeInfo,\n    left: NodeInfo,\n    _right: NodeInfo,\n    route: NodeInfo[],\n  ): void {\n    if (route.length === FIRST_PARAGRAPH_CONTENT_DEPTH) {\n      const leftNode = left.value as TextNode;\n      this.updatePreTextState();\n\n      this.thisNodeIsPreText = true;\n      this.previousRootParagraphContextType = leftNode.type;\n      this.rootParagraphNodeContentIndex++;\n    }\n  }\n\n  protected handleExitContentValueNode(_node: NodeInfo, route: NodeInfo[]): void | false {\n    if (route.length === FIRST_PARAGRAPH_CONTENT_DEPTH) {\n      this.updatePreTextState();\n\n      this.thisNodeIsPreText = false;\n      if (this.generateOptions.plainTextDividerAllowed && this.inPreText) {\n        this.havePreText = true;\n        this.preTextIndex = this.preTextIndexTemp;\n      }\n      this.inPreText = false;\n    }\n  }\n\n  private updatePreTextState(): void {\n    if (\n      !this.inPreText &&\n      this.thisNodeIsPreText &&\n      this.previousRootParagraphContextType === TextNodeType.hardBreak\n    ) {\n      // Enter pre-text if this node could be pre-text, and the previous node was a hard break\n      this.inPreText = true;\n      this.preTextIndexTemp = this.rootParagraphNodeContentIndex;\n    } else if (this.inPreText && !this.thisNodeIsPreText) {\n      this.inPreText = false;\n      this.preTextIndexTemp = -1;\n    }\n  }\n\n  protected handleEnterNodePreTextCheck(node: TextNode, route: NodeInfo[]) {\n    const firstParagraphContent = route.length === 4;\n\n    // If this is the first paragraph content node, check for pre-text, otherwise cannot be pre-text\n    if (firstParagraphContent) {\n      // If in pre-text, and this node is a hard break, stay in pre-text\n      if (this.inPreText && node.type === TextNodeType.hardBreak) return;\n\n      // If this node is text, then we might be in pre-text\n      if (node.type === TextNodeType.text) return;\n    }\n\n    // Any other node and we are not in pre-text any longer\n    this.thisNodeIsPreText = false;\n  }\n\n  /**\n   * Check if a text node has a link mark, and if so, return the href\n   *\n   * @param node the node to check for a link mark\n   * @returns the href, or false if no link mark\n   */\n  protected getLinkHref(node: TextNode): string | false {\n    if (node.type === TextNodeType.text && node.marks) {\n      const href = node.marks.reduce((acc, mark) => {\n        if (mark.type === TextMarkType.link) {\n          const linkMark = mark as LinkMark;\n          const href = linkMark.attrs?.href;\n          if (href) return href;\n        }\n        return acc;\n      }, '');\n\n      if (href) return href;\n    }\n\n    return false;\n  }\n\n  /**\n   * Get the current indentation string\n   * @returns\n   */\n  protected getIndentationString(): string {\n    // Return the cached indent if indent hasn't changed\n    if (this.currentIndent === this.prevIndent) return this.indentationStringCache;\n\n    let s = '';\n    for (let i = 1; i < this.currentIndent; i++) s += '\\t';\n    // for (let i = 1; i < this.currentIndent; i++) s += '_';\n\n    this.indentationStringCache = s;\n    this.prevIndent = this.currentIndent;\n\n    return s;\n  }\n\n  //\n  // WRITE FUNCTIONS\n  //\n\n  protected writeBodyBit(node: TextNode, route: NodeInfo[]) {\n    const placeholder = `[!${this.placeholderIndex}]`;\n    this.placeholders[placeholder] = node as unknown as BodyBitJson;\n\n    if (this.options.bodyBitCallback) {\n      const bodyBit = this.options.bodyBitCallback(\n        node as unknown as BodyBitJson,\n        this.placeholderIndex,\n        route,\n      );\n      this.write(bodyBit);\n    } else {\n      // Write placeholder to the text\n      this.write(placeholder);\n    }\n\n    this.placeholderIndex++;\n  }\n\n  protected writeText(node: TextNode): void {\n    if (node.text == null) return;\n\n    // Handle normal text\n    const codeBreakscaping = this.inCodeBlock;\n\n    // Get the text\n    let s: string = node.text;\n\n    // If the node has a single link mark, and the mark is the same (without protocol) as the text, write the link\n    // instead of the text. This is a special case.\n    const linkText = this.getLinkText(node);\n    if (linkText) s = linkText;\n\n    // Breakscape the text\n    if (linkText) {\n      // Only breakscape ] in links (done in getLinkText)\n      s = linkText;\n    } else {\n      if (!codeBreakscaping) {\n        s = this.breakscape(s, {\n          format: this.textFormat,\n          location: this.textLocation,\n        });\n      } else {\n        s = this.breakscape(s, {\n          format: this.textFormat,\n          location: this.textLocation,\n        });\n      }\n    }\n\n    // Apply any required indentation\n    if (this.currentIndent > 1) {\n      const indentationString = this.getIndentationString();\n      s = s.replace(INDENTATION_REGEX, `$1${indentationString}`);\n    }\n\n    // If have pre-text, and this is the correct index, write the plain text divider\n    if (this.havePreText && this.rootParagraphNodeContentIndex === this.preTextIndex) {\n      // Write the plain text divider\n      this.writePlainTextDivider();\n      this.writeNL();\n    }\n    if (this.havePreText && this.rootParagraphNodeContentIndex >= this.preTextIndex) {\n      // Write the text as pre-text\n      const s = this.breakscape(node.text, {\n        format: TextFormat.plainText,\n        location: this.textLocation, // Must be body for pre-text\n      });\n      this.write(s);\n    } else {\n      // Write the text\n      this.write(s);\n    }\n\n    // Handle pre-text check\n    if (this.currentIndent > 1 || codeBreakscaping) {\n      this.thisNodeIsPreText = false; // Not pre-text if indented or in code block\n    }\n    if (!this.inPreText && node.text === s) {\n      this.thisNodeIsPreText = false; // No-breakscaping, so don't enter pre-text\n    }\n  }\n\n  /**\n   * Check if a node is a link node and if so and the node has only the link mark, and the link without the\n   * protocol is the same as the text, return true. Otherwise return false.\n   *\n   * @param node\n   * @returns true if a simple link, otherwise false\n   */\n  protected isSimpleLink(node: TextNode): boolean {\n    if (node.text == null) return false;\n    if (node.marks?.length !== 1) return false;\n\n    const href = this.getLinkHref(node);\n    if (href) {\n      // Get the text part of the link\n      const hrefText = href.replace(LINK_REGEX, '$1');\n      return hrefText === node.text;\n    }\n    return false;\n  }\n\n  /**\n   * Get the link text if the node is a link, otherwise return false\n   *\n   * @param node\n   * @returns\n   */\n  protected getLinkText(node: TextNode): string | false {\n    if (node.text == null) return false;\n\n    const href = this.getLinkHref(node);\n    if (href) {\n      let res: string;\n      // Get the text part of the link\n      const hrefText = href.replace(LINK_REGEX, '$1');\n      if (hrefText === node.text) {\n        // Return the link as the text\n        res = href;\n      } else {\n        res = node.text;\n      }\n      res = (res ?? '').replace(LINK_BREAKSCAPE_REGEX, '^]'); // Link breakscaping\n      return res;\n    }\n    return false;\n  }\n\n  /**\n   * If the existing written text ends with a half-mark, and the new text starts with the same half-mark, insert a\n   * breakscape ^ between them to break the sequence.\n   *\n   * Only applies to bitmark version > 2\n   *\n   * @param s\n   */\n  protected getInterTextBreakscape(s: string): string {\n    if (this.bitmarkVersion === BitmarkVersion.v2) return '';\n    if (this.textFormat === TextFormat.plainText) return '';\n\n    const lastChar = this.writerText.slice(-1);\n    const firstChar = s.slice(0, 1);\n\n    // If the last char is a half-mark, and the first char is the same half-mark, insert a breakscape\n    if (lastChar === firstChar && ALL_HALF_MARKS.indexOf(lastChar) !== -1) {\n      return '^';\n    }\n\n    // If in the body and the first char is a bit tag start, and the last char is the second part of the tag,\n    // insert a breakscape\n    if (this.textLocation === TextLocation.body) {\n      if (lastChar === '[' && ALL_TAG_OPENING_ENDS.indexOf(firstChar) !== -1) {\n        return '^';\n      }\n    }\n\n    // Normal case, no breakscape\n    return '';\n  }\n\n  // protected getHrefTextFromHref\n\n  protected validateGenerateOptions(ast: TextNode[]): void {\n    // Validate plain text divider allowed\n    if (this.generateOptions.plainTextDividerAllowed) {\n      // Check there is only one node in the AST, and that it is a paragraph\n      if (ast.length !== 1) {\n        this.generateOptions.plainTextDividerAllowed = false;\n      } else if (ast.length === 1 && ast[0].type !== TextNodeType.paragraph) {\n        this.generateOptions.plainTextDividerAllowed = false;\n      }\n    }\n  }\n\n  /**\n   * Write the marks for the node.\n   *\n   * All marks need to be considered at once, because if there are multiple marks, they need to be written in\n   * a combined manner.\n   *\n   * e.g. if there are bold and italic marks, they need to be written as\n   *\n   * ==the text==|bold|italic|\n   * rather than\n   * **__the text__**\n   * or\n   * **__the text**__\n   *\n   * @param node the text node\n   * @param start true if starting (before) the text, false if ending (after) the text\n   */\n  protected writeMarks(node: TextNode, stage: StageType): void | false {\n    if (node.marks) {\n      // If this is a mark within inline text, or a heading, only inline marks are allowed\n      const forceSingleMark =\n        this.generateOptions.forceInline || !!(this.inInline || this.inHeading);\n\n      // If node has marks, it cannot be a pre-text node\n      this.thisNodeIsPreText = false;\n\n      // Empty marks occur when the inline mark has no attributes - write an inline mark with no attributes\n      const emptyMarks = node.marks.length === 0;\n      if (emptyMarks) {\n        // Write the mark start / end around the text\n        this.writeMarkTextWrapper(INLINE_MARK);\n        return;\n      }\n\n      // Resolve legacy mark combinations and drop marks the current grammar cannot express\n      const marks = this.getWritableMarks(node.marks);\n      if (marks.length === 0) return; // all marks dropped - the text is written unmarked\n\n      // Single marks are only valid if there is only one mark for this text\n      // They are only used in inline / heading marks since bitmark-- was dropped.\n      const singleMark = marks.length === 1 && forceSingleMark;\n\n      // Get the correct mark start / end\n      const markStartEnd = marks.reduce(\n        (acc, mark) => {\n          if (acc) return acc;\n          if (this.isStandardMark(mark)) {\n            if (singleMark) return STANDARD_MARKS[mark.type];\n            return INLINE_MARK;\n          } else if (this.isInlineMark(mark)) {\n            return INLINE_MARK;\n          } else {\n            // Do nothing (NOTE: link is handled in writeText)\n          }\n          return acc;\n        },\n        undefined as string | undefined,\n      );\n\n      // Check the special case of a simple link mark\n      const isSimpleLinkMark = this.isSimpleLink(node);\n\n      const haveMark = markStartEnd != null && !isSimpleLinkMark;\n\n      if (haveMark) {\n        // Write the mark start / end around the text (==)\n        if (stage == Stage.enter || stage == Stage.between) {\n          this.writeMarkTextWrapper(markStartEnd);\n        }\n\n        // Write the inline/comment mark if not entering (|<mark content>)\n        if (stage == Stage.between) {\n          for (const mark of marks) {\n            if (this.isStandardMark(mark)) {\n              if (!singleMark) {\n                this.writeInlineMarkStartEnd();\n                this.writeInlineMark(mark);\n              }\n            } else if (TextMarkType.comment === mark.type) {\n              this.writeInlineMarkStartEnd();\n              this.writeCommentMark(mark as CommentMark);\n            } else if (TextMarkType.link === mark.type) {\n              this.writeInlineMarkStartEnd();\n              this.writeLinkMark(mark as LinkMark);\n            } else if (TextMarkType.ref === mark.type) {\n              this.writeInlineMarkStartEnd();\n              this.writeRefMark(mark as RefMark);\n            } else if (TextMarkType.xref === mark.type) {\n              this.writeInlineMarkStartEnd();\n              this.writeXRefMark(mark as XRefMark);\n            } else if (TextMarkType.extref === mark.type) {\n              this.writeInlineMarkStartEnd();\n              this.writeExtRefMark(mark as ExtRefMark);\n            } else if (TextMarkType.footnote === mark.type) {\n              this.writeInlineMarkStartEnd();\n              this.writeFootnoteMark(mark as FootnoteMark);\n            } else if (TextMarkType.footnoteStar === mark.type) {\n              this.writeInlineMarkStartEnd();\n              this.writeFootnoteStarMark(mark as FootnoteMark);\n            } else if (TextMarkType.symbol === mark.type) {\n              this.writeInlineMarkStartEnd();\n              this.writeSymbolMark(mark as SymbolMark);\n            } else if (this.isInlineMark(mark)) {\n              this.writeInlineMarkStartEnd();\n              this.writeInlineMark(mark);\n            } else {\n              // Do nothing\n            }\n          }\n        }\n\n        // Write the inline/comment mark end when exiting (|)\n        if (stage == Stage.exit) {\n          let inlineMarkWritten = false;\n          for (const mark of marks) {\n            if (this.isStandardMark(mark)) {\n              if (!singleMark) {\n                inlineMarkWritten = true;\n              }\n            } else if (\n              TextMarkType.comment === mark.type ||\n              TextMarkType.link === mark.type ||\n              TextMarkType.ref === mark.type ||\n              TextMarkType.xref === mark.type ||\n              TextMarkType.footnote === mark.type ||\n              TextMarkType.footnoteStar === mark.type ||\n              this.isInlineMark(mark)\n            ) {\n              inlineMarkWritten = true;\n            } else {\n              // Do nothing (NOTE: link is handled in writeText)\n            }\n          }\n          // Write the mark end\n          if (inlineMarkWritten) this.writeInlineMarkStartEnd();\n        }\n      }\n    }\n  }\n\n  protected writeParagraph(node: TextNode, route: NodeInfo[]): void {\n    // Write paragraph marker for bitmark++\n    if (this.textFormat === TextFormat.bitmarkText) {\n      // Do not write a paragraph marker when in a bullet list\n      if (this.inBulletList) return;\n\n      // Get the previous sibling node type, if it exists\n      const siblingNodes = this.getSiblingNodes(route);\n      const prevSiblingNodeType: TextNodeTypeType | undefined = (siblingNodes.left as TextNode)\n        ?.type;\n\n      // Only continue and write a paragraph marker if:\n      // - in body (not tag where there are no blocks)\n      // - the previous sibling node exists and is one of [codeBlock, paragraph]\n      // - this is an empty paragraph\n      const inBody = this.textLocation === TextLocation.body;\n      const isEmptyParagraph = this.isEmptyParagraph(node);\n      if (\n        !inBody ||\n        (!isEmptyParagraph &&\n          !(\n            prevSiblingNodeType === TextNodeType.codeBlock ||\n            prevSiblingNodeType === TextNodeType.paragraph\n          ))\n      ) {\n        return;\n      }\n\n      this.write('|');\n      this.writeNL();\n      if (prevSiblingNodeType === TextNodeType.codeBlock) {\n        // Write an extra newline after a code block\n        this.writeNL();\n      }\n    }\n  }\n\n  protected writeHardBreak(_node: TextNode): void {\n    this.writeNL();\n\n    // Apply any required indentation (when in list)\n    if (this.currentIndent > 1) {\n      const indentationString = this.getIndentationString();\n      this.write(indentationString);\n    }\n  }\n\n  protected writeHeading(node: HeadingTextNode): void {\n    let s = '';\n    const level = node.attrs?.level ?? 1;\n    for (let i = 0; i < +level; i++) s += HEADING_TAG;\n\n    s += ' ';\n\n    // Write the heading tag\n    this.write(s);\n  }\n\n  protected writeSection(node: SectionTextNode): void {\n    let s = '';\n    if (node.section) {\n      s = `|${node.section}: `;\n    } else {\n      s = '|';\n    }\n\n    // Write the section tag\n    this.write(s);\n  }\n\n  protected writeBullet(node: TextNode, route: NodeInfo[]) {\n    // if (node.attrs == null || !node.attrs.start) return;\n    // const attrs = node.attrs;\n\n    // const s = `|code:${attrs.language}\\n`;\n\n    // Add indentation\n    let bullet = this.getIndentationString();\n    const listParent = this.getParentNode(route, 2);\n    const listParentNode: ListTextNode | undefined = listParent?.value;\n    const listType = listParentNode?.type;\n    const start = listParentNode?.attrs?.start ?? 1;\n\n    // Add bullet\n    if (listType === TextNodeType.bulletList) {\n      bullet += '• ';\n    } else if (listType === TextNodeType.noBulletList) {\n      bullet += '•_ ';\n    } else if (listType === TextNodeType.orderedList) {\n      bullet += `•${start} `;\n    } else if (listType === TextNodeType.orderedListRoman) {\n      bullet += `•${start}I `;\n    } else if (listType === TextNodeType.orderedListRomanLower) {\n      bullet += `•${start}i `;\n    } else if (listType === TextNodeType.letteredList) {\n      bullet += '•A ';\n    } else if (listType === TextNodeType.letteredListLower) {\n      bullet += '•a ';\n    } else if (listType === TextNodeType.taskList) {\n      const taskList = node as TaskItemTextNode;\n      const checked = taskList.attrs?.checked ?? false;\n      bullet += checked ? '•+ ' : '•- ';\n    }\n    if (bullet) this.write(bullet);\n  }\n\n  protected writeImage(node: ImageTextNode | ImageInlineTextNode): void {\n    if (node.attrs == null || !node.attrs.src) return;\n    const attrs = node.attrs;\n\n    const inlineImage = node.type === TextNodeType.imageInline;\n\n    let ignoreAttributes: Set<string> | undefined;\n    if (inlineImage) {\n      ignoreAttributes = new Set(['alt', 'zoomDisabled', 'title']);\n      // Suppress attrs equal to the grammar defaults (the parser re-adds them)\n      const a = attrs as unknown as Record<string, unknown>;\n      if (a.alignmentVertical === 'top') ignoreAttributes.add('alignmentVertical');\n      if (a.size === 'line-height') ignoreAttributes.add('size');\n    }\n    const mediaAttrs = this.getMediaAttrs(inlineImage ? 'imageInline' : 'image', attrs, {\n      ignoreAttributes,\n    });\n\n    let s = '';\n    if (inlineImage) {\n      s = `==${attrs.alt ?? ''}==`;\n    }\n    s += mediaAttrs ? `|${mediaAttrs}|` : '';\n\n    // Write the text\n    this.write(s);\n  }\n\n  protected writeCodeBlock(node: CodeBlockTextNode): void {\n    if (node.attrs == null || !node.attrs.language) return;\n    const attrs = node.attrs;\n\n    const s = `|code:${attrs.language}\\n`;\n\n    // Write the text\n    this.write(s);\n  }\n\n  protected writeLatex(node: LatexTextNode): void {\n    if (node.attrs == null || !node.attrs.formula) return;\n    const attrs = node.attrs;\n\n    const formula = this.breakscape(attrs.formula, {\n      format: this.textFormat,\n      location: this.textLocation,\n    });\n\n    const s = `==${formula}==|latex|`;\n\n    // Write the text\n    this.write(s);\n  }\n\n  protected writeMarkTextWrapper(s: string) {\n    if (s) this.write(s);\n  }\n\n  protected writeInlineMark(mark: TextMark) {\n    const attrs = (mark.attrs ?? {}) as Record<string, unknown>;\n    let s: string;\n\n    switch (mark.type) {\n      case TextMarkType.textStyle:\n      case TextMarkType.color: // legacy input, normalized to the current chain form\n        s = `color:${attrs.color ?? ''}`;\n        break;\n      case TextMarkType.timer:\n        // getWritableMarks guarantees a duration is present\n        s = attrs.name ? `timer:${attrs.name}` : 'timer';\n        s += `|duration:${attrs.duration ?? ''}`;\n        break;\n      case TextMarkType.highlight:\n      case TextMarkType.userHighlight:\n        s = attrs.color ? `${mark.type}|color:${attrs.color}` : `${mark.type}`;\n        break;\n      default: {\n        s = `${mark.type}`;\n        for (const [k, v] of Object.entries(attrs)) {\n          if ((k === 'language' && v !== 'plain text') || k === 'propertyRef' || k === 'name') {\n            s = `${s}:${v}`;\n          }\n        }\n      }\n    }\n\n    this.write(s);\n  }\n\n  /**\n   * Resolve the marks of a text node into the marks that will actually be written.\n   *\n   * - Merges a legacy standalone 'duration' mark into its sibling 'timer' mark.\n   * - Drops marks the current grammar cannot express (standalone 'duration', 'timer'\n   *   without a duration).\n   * - Moves a 'textStyle'/'color' mark before a preceding bare 'highlight'/'userHighlight'\n   *   mark when its color is a valid highlight color; written in the original order the\n   *   output would re-parse as a highlight-with-color compound mark and change meaning.\n   */\n  protected getWritableMarks(nodeMarks: TextMark[]): TextMark[] {\n    const attrsOf = (m: TextMark) => (m.attrs ?? {}) as Record<string, unknown>;\n\n    let marks: TextMark[] = [...nodeMarks];\n\n    // Merge a legacy timer + duration mark pair\n    const timer = marks.find((m) => m.type === TextMarkType.timer);\n    const duration = marks.find((m) => m.type === TextMarkType.duration);\n    if (timer && duration && !attrsOf(timer).duration) {\n      marks = marks.map((m) =>\n        m === timer\n          ? ({\n              ...timer,\n              attrs: { ...attrsOf(timer), duration: attrsOf(duration).duration },\n            } as TextMark)\n          : m,\n      );\n    }\n\n    // Drop marks the current grammar cannot express\n    marks = marks.filter((m) => {\n      if (m.type === TextMarkType.duration) return false;\n      if (m.type === TextMarkType.timer) return !!attrsOf(m).duration;\n      return true;\n    });\n\n    // Reorder [bare highlight/userHighlight, textStyle(valid highlight color)] pairs\n    const isBareHighlight = (m: TextMark) =>\n      (m.type === TextMarkType.highlight || m.type === TextMarkType.userHighlight) &&\n      !attrsOf(m).color;\n    const isHighlightColorStyle = (m: TextMark) =>\n      (m.type === TextMarkType.textStyle || m.type === TextMarkType.color) &&\n      HIGHLIGHT_COLORS.indexOf(attrsOf(m).color as string) !== -1;\n    for (let i = 0; i < marks.length - 1; i++) {\n      if (isBareHighlight(marks[i]) && isHighlightColorStyle(marks[i + 1])) {\n        const tmp = marks[i];\n        marks[i] = marks[i + 1];\n        marks[i + 1] = tmp;\n      }\n    }\n\n    return marks;\n  }\n\n  /**\n   * True if the mark is written using its standard form (e.g. **bold**, !!highlight!!)\n   * when it is the only mark. A highlight mark with a color attribute is excluded - it\n   * can only be expressed using the inline chain form (==text==|highlight|color:x|).\n   */\n  protected isStandardMark(mark: TextMark): boolean {\n    if (STANDARD_MARK_TYPES.indexOf(mark.type) === -1) return false;\n    return !(mark.attrs && (mark.attrs as Record<string, unknown>).color);\n  }\n\n  /**\n   * True if the mark is written using the inline chain form (==text==|mark|).\n   */\n  protected isInlineMark(mark: TextMark): boolean {\n    if (INLINE_MARK_TYPES.indexOf(mark.type) !== -1) return true;\n    return (\n      mark.type === TextMarkType.highlight &&\n      !!(mark.attrs && (mark.attrs as Record<string, unknown>).color)\n    );\n  }\n\n  protected writeCommentMark(mark: CommentMark) {\n    const comment = mark.comment || '';\n\n    const s = `#${comment}`;\n    this.write(s);\n  }\n\n  protected writeLinkMark(mark: LinkMark) {\n    const href = mark.attrs?.href || '';\n\n    // Apply link breakscaping\n    const linkText = (href ?? '').replace(LINK_BREAKSCAPE_REGEX, '^]');\n\n    const s = `link:${linkText}`;\n    this.write(s);\n  }\n\n  protected writeRefMark(mark: RefMark) {\n    const ref = mark.attrs?.reference ?? '';\n\n    const s = `►${ref}`;\n    this.write(s);\n  }\n\n  protected writeXRefMark(mark: XRefMark) {\n    const xref = mark.attrs?.xref ?? '';\n    const ref = mark.attrs?.reference ?? '';\n\n    let s = `xref:${xref}`;\n    if (ref) s += `|►${ref}`;\n    this.write(s);\n  }\n\n  protected writeExtRefMark(mark: ExtRefMark) {\n    const extref = mark.attrs?.extref ?? '';\n    const refs = mark.attrs?.references ?? [];\n    const provider = mark.attrs?.provider ?? '';\n\n    let s = `extref:${extref}`;\n    for (const ref of refs) {\n      s += `|►${ref ?? ''}`;\n    }\n    s += `|provider:${provider}`;\n\n    this.write(s);\n  }\n\n  protected writeFootnoteMark(mark: FootnoteMark) {\n    const s = `footnote:`;\n    this.write(s);\n\n    // Write the footnote content\n    const text =\n      this.internalTextGenerator?.generateSync(\n        mark.attrs?.content as TextNode[],\n        this.textFormat,\n        this.textLocation,\n        {\n          ...this.generateOptions,\n          forceInline: true,\n        },\n      ) ?? '';\n\n    this.write(text);\n  }\n\n  protected writeFootnoteStarMark(mark: FootnoteMark) {\n    const s = `footnote*:`;\n    this.write(s);\n\n    // Write the footnote star content\n    const text =\n      this.internalTextGenerator?.generateSync(\n        mark.attrs?.content as TextNode[],\n        this.textFormat,\n        this.textLocation,\n        {\n          ...this.generateOptions,\n          forceInline: true,\n        },\n      ) ?? '';\n\n    this.write(text);\n  }\n\n  protected writeSymbolMark(mark: SymbolMark) {\n    if (mark.attrs == null) return;\n    const attrs = mark.attrs;\n\n    const mediaAttrs = this.getMediaAttrs('symbol', attrs);\n    const s = mediaAttrs ?? '';\n\n    // Write the text\n    this.write(s);\n  }\n\n  protected writeInlineMarkStartEnd() {\n    this.write('|');\n  }\n\n  protected writePlainTextDivider(): void {\n    this.write('==== text ====');\n  }\n\n  protected writeString(s?: string): void {\n    if (s != null) this.write(`${s}`);\n  }\n\n  protected writeNL(): void {\n    if (this.options.debugGenerationInline) {\n      this.write('\\\\n');\n      return;\n    }\n    this.write('\\n');\n  }\n\n  protected writeInlineDebug(\n    key: string,\n    state: { open?: boolean; close?: boolean; single?: boolean },\n  ) {\n    let tag = key;\n    if (state.open) {\n      tag = `<${key}>`;\n    } else if (state.close) {\n      tag = `</${key}>`;\n    } else if (state.single) {\n      tag = `<${key} />`;\n    }\n\n    this.writeString(tag);\n  }\n\n  protected getMediaAttrs(\n    mediaType: string,\n    attrs: MediaAttributes,\n    options?: MediaAttributeOptions,\n  ): string | undefined {\n    if (!mediaType) return undefined;\n\n    const opts = Object.assign({}, options);\n    const ignoreAttributes = opts.ignoreAttributes ?? new Set();\n\n    let s = `${mediaType}:${attrs?.src ?? ''}`;\n\n    // Loop and write the attributes (except src, as written above)\n    const entries = Object.entries(attrs).filter(([k, _v]) => k !== 'src');\n\n    for (let i = 0; i < entries.length; i++) {\n      const [k, v] = entries[i];\n\n      // Ignore certain attributes\n      if (ignoreAttributes.has(k)) continue;\n\n      switch (k) {\n        case 'textAlign':\n          if (v !== 'left') s += `|captionAlign:${v}`;\n          break;\n        case 'alignment':\n          if (v !== 'center') if (v) s += `|alignment:${v}`;\n          break;\n        case 'title':\n          if (v) s += `|caption:${v}`;\n          break;\n        case 'class':\n          if (v !== 'center') if (v) s += `|align:${v}`;\n          break;\n        case 'comment':\n          if (v) s += `|#${v}`;\n          break;\n        case '':\n          // This case handles reverse of strange behaviour in the text parser when a key is empty\n          if (StringUtils.isString(v)) s += `|:${v}`;\n          else s += `|`;\n          break;\n        case 'zoomDisabled':\n          if (!v) s += '|zoomDisabled:false';\n          break;\n        case 'alt':\n        case 'width':\n        case 'height':\n        default:\n          if (k && v) s += `|${k}:${v}`;\n          break;\n      }\n    }\n\n    return s;\n  }\n\n  //\n  // Helper functions\n  //\n\n  protected breakscape(s: string, options: BreakscapeOptions): string {\n    if (this.generateOptions.noBreakscaping) return s;\n    return Breakscape.breakscape(s, options);\n  }\n\n  protected getBitType(route: NodeInfo[]): BitTypeType | undefined {\n    for (const node of route) {\n      if (node.key === NodeType.bitsValue) {\n        const n = node.value as Bit;\n        return n?.bitType;\n      }\n    }\n\n    return undefined;\n  }\n\n  //\n  // Writer interface\n  //\n\n  /**\n   * Writes a string value to the output.\n   * @param value - The string value to be written.\n   */\n  write(value: string): this {\n    // Handle case where the already written text, combined with this text, would create an unwanted control\n    // sequence, e.g. old* **new**. In this case, a ^ is inserted to break the sequence.\n    value = this.getInterTextBreakscape(value) + value;\n\n    if (this.options.writeCallback) {\n      this.options.writeCallback(value);\n    }\n    this.writerText += value;\n\n    // for debugging console.log(this.writerText);\n\n    return this;\n  }\n\n  /**\n   * Writes a new line to the output. The line is indented automatically. The line is ended with the endOfLineString.\n   * @param value - The line to write. When omitted, only the endOfLineString is written.\n   */\n  writeLine(value?: string): this {\n    this.write(`${value}\\n`);\n    return this;\n  }\n\n  /**\n   * Writes a collection of lines to the output. Each line is indented automatically and ended with the endOfLineString.\n   * @param values - The lines to write.\n   * @param delimiter - An optional delimiter to be written at the end of each line, except for the last one.\n   */\n  writeLines(values: string[], delimiter?: string): this {\n    for (const value of values) {\n      this.write(`${value}${delimiter ?? ''}\\n`);\n    }\n    return this;\n  }\n\n  /**\n   * Writes a single whitespace character to the output.\n   */\n  writeWhiteSpace(): this {\n    this.write(' ');\n    return this;\n  }\n}\n\nexport { TextGenerator };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst BitmarkVersion = {\n  v2: 2,\n  v3: 3,\n} as const;\n\nexport type BitmarkVersionType = EnumType<typeof BitmarkVersion>;\n\nconst DEFAULT_BITMARK_VERSION = BitmarkVersion.v3;\n\nexport { BitmarkVersion, DEFAULT_BITMARK_VERSION };\n","import { Ast, type AstWalkCallbacks, type NodeInfo } from '../ast/Ast.ts';\nimport type { TextNode } from '../model/ast/TextNodes.ts';\nimport { TextNodeType } from '../model/enum/TextNodeType.ts';\nimport { type Generator } from './Generator.ts';\n\n/**\n * Generator that walks bitmark AST.\n *\n * The implementation should implement functions with the correct naming, and these will be called when\n * walking the AST:\n *\n * enter_<nodeKey>() - called when entering a branch node\n * between_<nodeKey>() - called when between child nodes\n * exit_<nodeKey>() - called when exiting a branch node\n * leaf_<nodeKey>() - called when entering a leaf node\n */\nabstract class AstWalkerGenerator<AstType, R, Context = undefined>\n  implements Generator<AstType, R>, AstWalkCallbacks<Context>\n{\n  protected ast = new Ast();\n\n  // Debugging\n  protected debugGenerationInline = false;\n  protected printed = false;\n\n  public abstract generate(ast: AstType, param1?: unknown, param2?: unknown): Promise<R>;\n\n  public abstract generateSync(ast: AstType, param1?: unknown, param2?: unknown): R;\n\n  enter(node: NodeInfo, route: NodeInfo[], context: Context): boolean | void {\n    let res: boolean | void = void 0;\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const gen = this as any;\n    const funcName = `enter_${node.key}`;\n\n    if (!this.printed) {\n      this.printed = true;\n    }\n\n    if (this.debugGenerationInline) this.writeInlineDebug(node.key, { open: true });\n\n    if (typeof gen[funcName] === 'function') {\n      res = gen[funcName](node, route, context);\n    }\n\n    return res;\n  }\n\n  between(\n    node: NodeInfo,\n    left: NodeInfo,\n    right: NodeInfo,\n    route: NodeInfo[],\n    context: Context,\n  ): boolean | void {\n    let res: boolean | void = void 0;\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const gen = this as any;\n    const funcName = `between_${node.key}`;\n\n    if (this.debugGenerationInline) this.writeInlineDebug(node.key, { single: true });\n\n    if (typeof gen[funcName] === 'function') {\n      res = gen[funcName](node, left, right, route, context);\n    }\n\n    return res;\n  }\n\n  exit(node: NodeInfo, route: NodeInfo[], context: Context): void {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const gen = this as any;\n    const funcName = `exit_${node.key}`;\n\n    if (this.debugGenerationInline) this.writeInlineDebug(node.key, { close: true });\n\n    if (typeof gen[funcName] === 'function') {\n      gen[funcName](node, route, context);\n    }\n  }\n\n  leaf(node: NodeInfo, route: NodeInfo[], context: Context): void {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const gen = this as any;\n    const funcName = `leaf_${node.key}`;\n\n    if (this.debugGenerationInline) this.writeInlineDebug(node.key, { open: true });\n\n    if (typeof gen[funcName] === 'function') {\n      gen[funcName](node, route, context);\n    }\n\n    if (this.debugGenerationInline) this.writeInlineDebug(node.key, { close: true });\n  }\n\n  //\n  // HELPER FUNCTIONS\n  //\n\n  protected getParentNode(route: NodeInfo[], nodesBack = 1): NodeInfo | undefined {\n    // if (route.length > nodesBack + 1) {\n    //   return route[route.length - nodesBack - 1];\n    // }\n    if (route.length > nodesBack) {\n      return route[route.length - nodesBack - 1];\n    }\n\n    return undefined;\n  }\n\n  protected getSiblingNodes(route: NodeInfo[]): { left?: unknown; right?: unknown } {\n    const parentNode = this.getParentNode(route);\n    if (!parentNode || !parentNode.value || !Array.isArray(parentNode.value)) {\n      return {};\n    }\n\n    const siblings = parentNode.value as unknown[];\n    const index = siblings.findIndex((s) => s === route[route.length - 1]?.value);\n    if (index === -1) {\n      return {};\n    }\n\n    return {\n      left: index > 0 ? siblings[index - 1] : undefined,\n      right: index < siblings.length - 1 ? siblings[index + 1] : undefined,\n    };\n  }\n\n  protected isEmptyParagraph(node: TextNode): boolean {\n    if (!node) return false;\n    if (node.type !== TextNodeType.paragraph) return false;\n    if (!node.content || !Array.isArray(node.content)) return true;\n\n    // Loop all the content nodes and check if they are all empty text nodes\n    for (const contentNode of node.content) {\n      if (contentNode.type !== TextNodeType.text) return false;\n      if (contentNode.text && contentNode.text.trim() !== '') return false;\n    }\n\n    return true;\n  }\n\n  //\n  // WRITER FUNCTIONS\n  //\n\n  protected abstract writeInlineDebug(\n    key: string,\n    state: { open?: boolean; close?: boolean; single?: boolean },\n  ): void;\n}\n\nexport { AstWalkerGenerator };\n","// @generated by Peggy 5.1.0.\n//\n// https://peggyjs.org/\n\nimport { Breakscape } from \"../../../breakscaping/Breakscape.ts\";\n\n\n\n\nconst VERSION = \"8.41.1\"\n\n//Parser peggy.js\n\n// parser options (parameter when running parser):\n// allowedStartRules: [\"bitmarkPlusPlus\", \"bitmarkPlus\", \"bitmarkMinusMinus\", \"bitmarkPlusString\", \"bitmarkMinusMinusString\"]\n\n// The start rules ending in \"String\" are for internal use only.\n// The public rules return a full StyledText object. This means things got consitent to handle. However, this means, there is always at least one block (a paragraph in case of bitmark+ and bitmark--) present.\n\n// Todos\n\n// - JSON for color\n\n// - LaTeX embed\n// The formula == \\\\left( x | y \\\\right) ==|latex| is inline.\n\n/*\n\nEmpty StyledString\n\n[{ \"type\": \"text\", \"text\": \"\" }] // NOK - TipTap Error\n[{ \"type\": \"text\"}] // NOK - TipTap Error\n[] - OK\n\nEmpty StyledText\n\n[{ \"type\": \"paragraph\", \"content\": [] }] // OK\n[{ \"type\": \"paragraph\" }] // OK\n[] // OK - preferred\n\n*/\n\n/*\n\n# Hallo\n\nHier kommt...\n\nAlex\n\n|\n\n## Vorhang auf!\n\n• Eins\n• Zwei\n\t•1 Num 1 ==inline code==|code:javascript|\n\t•1 Num 2\n\tSecond Line\n• Three\n\t•A Sub Three\n\t•A More Sub Three\n\n\n•+ Milk\n•+ Cheese\n•- Wine\n\n\n|image:https://apple.com|width:300|height: 400|\n\ntext ==alt text of the inline image==|image:https://img.io/img.svg|width:400|height:200|#comment| more text\n\n|code: javascript\n\nlet a = 3\nlet b = 4\n\nlet c = a + b\n\n|^code: js\n\n\n|\n\nDas war's ==1==|footnote:So long and **thanks for all the fish**|\n\n */\n\n\n\n\n\n// global initializer\n// global utility functions\n\n\nfunction s(_string) {\n  return _string ?? \"\"\n}\n\nfunction legacyContextAwarewUnbreakscape(_str) {\n\tlet u_ = _str || \"\"\n\n\tfunction replacer(match, p1, offset, string, groups) {\n  \t\treturn match.replace(\"^\", \"\");\n\t}\n\n  let re_ = new RegExp( /=\\^(\\^*)(?==)|\\*\\^(\\^*)(?=\\*)|_\\^(\\^*)(?=_)|`\\^(\\^*)(?=`)|!\\^(\\^*)(?=!)|\\[\\^(\\^*)|•\\^(\\^*)|#\\^(\\^*)|\\|\\^(\\^*)|\\|\\^(\\^*)/, \"g\") // RegExp( /([\\[*_`!])\\^(?!\\^)/, \"g\")\n\n  u_ = u_.replace(re_, replacer)\n\n  return u_\n}\n\nfunction unbreakscape(str) {\n  if (typeof str !== 'string') return null;\n  // return str.replace(/\\^+/g, run => run.slice(1));\n\n  return Breakscape.unbreakscape(str);\n}\n\nfunction removeTempParsingParent(obj) {\n    if (obj && typeof obj === 'object') {\n        delete obj._tempParsingParent; // Remove temp property if exists\n        delete obj._tempListStart; // Remove temp property if exists\n\n        Object.keys(obj).forEach(key => {\n            // Recursively call the function for all sub-objects\n            removeTempParsingParent(obj[key]);\n        });\n    }\n}\n\n// function cleanEmptyTextNodes(node) {\n//   debugger;\n//   if (Array.isArray(node)) {\n//     return node.map(cleanEmptyTextNodes);\n//   }\n//   if (node !== null && typeof node === 'object') {\n//     const hasType    = Object.prototype.hasOwnProperty.call(node, 'type');\n//     const hasContent = Object.prototype.hasOwnProperty.call(node, 'content');\n//     const result = {};\n\n//     for (const [key, value] of Object.entries(node)) {\n//       if (key === 'content' && hasType && hasContent && Array.isArray(value)) {\n//         // filter out items where item.text === \"\"\n//         const filtered = value.filter(item =>\n//           !(item && typeof item === 'object' && 'text' in item && item.text === '')\n//         );\n//         result[key] = filtered.map(cleanEmptyTextNodes);\n\n//       } else if (Array.isArray(value)) {\n//         result[key] = value.map(cleanEmptyTextNodes);\n\n//       } else {\n//         result[key] = cleanEmptyTextNodes(value);\n//       }\n//     }\n\n//     return result;\n//   }\n//   return node;\n// }\n\n/**\n * RAS 2025-05-22\n * Fixes / features\n * - Handles arrays or objects as input (including root array) - main reason for change\n * - Modifies in-place rather than copying array.\n * - Removed some unnecessary checks - will work fine without them\n */\nfunction cleanEmptyTextNodes(root) {\n  const isEmptyTextNode = (n) => n && n.type === \"text\" && !n.text;\n\n  // Recursively walk 'content' arrays\n  function cleanContentArray(arr) {\n    for (let i = arr.length - 1; i >= 0; i--) {\n      const item = arr[i];\n\n      if (isEmptyTextNode(item)) {\n        // drop the empty text node\n        arr.splice(i, 1);\n      } else if (item && Array.isArray(item.content)) {\n        // recurse into `content` array\n        cleanContentArray(item.content);\n      }\n      // Any other shape is ignored.\n    }\n  }\n\n  if (Array.isArray(root)) {\n    cleanContentArray(root);\n  } else if (root && Array.isArray(root.content)) {\n    cleanContentArray(root.content);\n  }\n\n  return root;\n}\n\nfunction bitmarkPlusPlus(_str) {\n\n  // if (parser) {\n  // \treturn parser.parse(_str, { startRule: \"bitmarkPlusPlus\" })\n  // } else {\n  //   // embedded in Get More Brain\n  //   return parse(_str, { startRule: \"bitmarkPlusPlus\" })\n  // }\n  if (typeof parser !== 'undefined') {\n  \treturn parser.parse(_str, { startRule: \"bitmarkPlusPlus\" })\n  }\n  return peg$parse(_str, { startRule: \"bitmarkPlusPlus\" })\n}\n\nfunction bitmarkPlusString(_str) {\n\n  // if (parser) {\n  // \treturn parser.parse(_str, { startRule: \"bitmarkPlusString\" })\n  // } else {\n  //   // embedded in Get More Brain\n  //   return parse(_str, { startRule: \"bitmarkPlusString\" })\n  // }\n  if (typeof parser !== 'undefined') {\n    return parser.parse(_str, { startRule: \"bitmarkPlusString\" })\n  }\n  return peg$parse(_str, { startRule: \"bitmarkPlusString\" })\n}\n\nfunction bitmarkMinusMinusString(_str) {\n\n  // if (parser) {\n  // \treturn parser.parse(_str, { startRule: \"bitmarkMinusMinusString\" })\n  // } else {\n  //   // embedded in Get More Brain\n  //   return parse(_str, { startRule: \"bitmarkMinusMinusString\" })\n  // }\n  if (typeof parser !== 'undefined') {\n  \treturn parser.parse(_str, { startRule: \"bitmarkMinusMinusString\" })\n  }\n  return peg$parse(_str, { startRule: \"bitmarkMinusMinusString\" })\n}\n\n\nclass peg$SyntaxError extends SyntaxError {\n  constructor(message, expected, found, location) {\n    super(message);\n    this.expected = expected;\n    this.found = found;\n    this.location = location;\n    this.name = \"SyntaxError\";\n  }\n\n  format(sources) {\n    let str = \"Error: \" + this.message;\n    if (this.location) {\n      let src = null;\n      const st = sources.find(s => s.source === this.location.source);\n      if (st) {\n        src = st.text.split(/\\r\\n|\\n|\\r/g);\n      }\n      const s = this.location.start;\n      const offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n        ? this.location.source.offset(s)\n        : s;\n      const loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n      if (src) {\n        const e = this.location.end;\n        const filler = \"\".padEnd(offset_s.line.toString().length, \" \");\n        const line = src[s.line - 1];\n        const last = s.line === e.line ? e.column : line.length + 1;\n        const hatLen = (last - s.column) || 1;\n        str += \"\\n --> \" + loc + \"\\n\"\n            + filler + \" |\\n\"\n            + offset_s.line + \" | \" + line + \"\\n\"\n            + filler + \" | \" + \"\".padEnd(s.column - 1, \" \")\n            + \"\".padEnd(hatLen, \"^\");\n      } else {\n        str += \"\\n at \" + loc;\n      }\n    }\n    return str;\n  }\n\n  static buildMessage(expected, found) {\n    function hex(ch) {\n      return ch.codePointAt(0).toString(16).toUpperCase();\n    }\n\n    const nonPrintable = Object.prototype.hasOwnProperty.call(RegExp.prototype, \"unicode\")\n      ? new RegExp(\"[\\\\p{C}\\\\p{Mn}\\\\p{Mc}]\", \"gu\")\n      : null;\n    function unicodeEscape(s) {\n      if (nonPrintable) {\n        return s.replace(nonPrintable,  ch => \"\\\\u{\" + hex(ch) + \"}\");\n      }\n      return s;\n    }\n\n    function literalEscape(s) {\n      return unicodeEscape(s\n        .replace(/\\\\/g, \"\\\\\\\\\")\n        .replace(/\"/g,  \"\\\\\\\"\")\n        .replace(/\\0/g, \"\\\\0\")\n        .replace(/\\t/g, \"\\\\t\")\n        .replace(/\\n/g, \"\\\\n\")\n        .replace(/\\r/g, \"\\\\r\")\n        .replace(/[\\x00-\\x0F]/g,          ch => \"\\\\x0\" + hex(ch))\n        .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, ch => \"\\\\x\"  + hex(ch)));\n    }\n\n    function classEscape(s) {\n      return unicodeEscape(s\n        .replace(/\\\\/g, \"\\\\\\\\\")\n        .replace(/\\]/g, \"\\\\]\")\n        .replace(/\\^/g, \"\\\\^\")\n        .replace(/-/g,  \"\\\\-\")\n        .replace(/\\0/g, \"\\\\0\")\n        .replace(/\\t/g, \"\\\\t\")\n        .replace(/\\n/g, \"\\\\n\")\n        .replace(/\\r/g, \"\\\\r\")\n        .replace(/[\\x00-\\x0F]/g,          ch => \"\\\\x0\" + hex(ch))\n        .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, ch => \"\\\\x\"  + hex(ch)));\n    }\n\n    const DESCRIBE_EXPECTATION_FNS = {\n      literal(expectation) {\n        return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n      },\n\n      class(expectation) {\n        const escapedParts = expectation.parts.map(\n          part => (Array.isArray(part)\n            ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n            : classEscape(part))\n        );\n\n        return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\" + (expectation.unicode ? \"u\" : \"\");\n      },\n\n      any() {\n        return \"any character\";\n      },\n\n      end() {\n        return \"end of input\";\n      },\n\n      other(expectation) {\n        return expectation.description;\n      },\n    };\n\n    function describeExpectation(expectation) {\n      return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n    }\n\n    function describeExpected(expected) {\n      const descriptions = expected.map(describeExpectation);\n      descriptions.sort();\n\n      if (descriptions.length > 0) {\n        let j = 1;\n        for (let i = 1; i < descriptions.length; i++) {\n          if (descriptions[i - 1] !== descriptions[i]) {\n            descriptions[j] = descriptions[i];\n            j++;\n          }\n        }\n        descriptions.length = j;\n      }\n\n      switch (descriptions.length) {\n        case 1:\n          return descriptions[0];\n\n        case 2:\n          return descriptions[0] + \" or \" + descriptions[1];\n\n        default:\n          return descriptions.slice(0, -1).join(\", \")\n            + \", or \"\n            + descriptions[descriptions.length - 1];\n      }\n    }\n\n    function describeFound(found) {\n      return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n    }\n\n    return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n  }\n}\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  const peg$FAILED = {};\n  const peg$source = options.grammarSource;\n\n  const peg$startRuleFunctions = {\n    version: peg$parseversion,\n    bitmarkPlusPlus: peg$parsebitmarkPlusPlus,\n    bitmarkPlus: peg$parsebitmarkPlus,\n    bitmarkMinusMinus: peg$parsebitmarkMinusMinus,\n    bitmarkPlusString: peg$parsebitmarkPlusString,\n    bitmarkMinusMinusString: peg$parsebitmarkMinusMinusString,\n  };\n  let peg$startRuleFunction = peg$parseversion;\n\n  const peg$c0 = \"|\";\n  const peg$c1 = \"### \";\n  const peg$c2 = \"## \";\n  const peg$c3 = \"# \";\n  const peg$c4 = \"code\";\n  const peg$c5 = \":\";\n  const peg$c6 = \"bitmark++\";\n  const peg$c7 = \"bitmark--\";\n  const peg$c8 = \"JavaScript\";\n  const peg$c9 = \"\\u2022 \";\n  const peg$c10 = \"\\u2022_ \";\n  const peg$c11 = \"\\u2022\";\n  const peg$c12 = \" \";\n  const peg$c13 = \"I \";\n  const peg$c14 = \"i \";\n  const peg$c15 = \"\\u2022A \";\n  const peg$c16 = \"\\u2022a \";\n  const peg$c17 = \"\\u2022+ \";\n  const peg$c18 = \"\\u2022- \";\n  const peg$c19 = \"\\t\";\n  const peg$c20 = \"image\";\n  const peg$c21 = \"#\";\n  const peg$c22 = \"@\";\n  const peg$c23 = \"width\";\n  const peg$c24 = \"height\";\n  const peg$c25 = \"alignment\";\n  const peg$c26 = \"captionAlign\";\n  const peg$c27 = \"left\";\n  const peg$c28 = \"center\";\n  const peg$c29 = \"right\";\n  const peg$c30 = \"alt\";\n  const peg$c31 = \"caption\";\n  const peg$c32 = \"zoomDisabled\";\n  const peg$c33 = \"true\";\n  const peg$c34 = \"false\";\n  const peg$c35 = \"=\";\n  const peg$c36 = \"|latex|\";\n  const peg$c37 = \"|imageInline:\";\n  const peg$c38 = \"srcAlt\";\n  const peg$c39 = \"alignmentVertical\";\n  const peg$c40 = \"size\";\n  const peg$c41 = \"top\";\n  const peg$c42 = \"middle\";\n  const peg$c43 = \"bottom\";\n  const peg$c44 = \"baseline\";\n  const peg$c45 = \"sub\";\n  const peg$c46 = \"super\";\n  const peg$c47 = \"text-bottom\";\n  const peg$c48 = \"text-top\";\n  const peg$c49 = \"line-height\";\n  const peg$c50 = \"font-height\";\n  const peg$c51 = \"explicit\";\n  const peg$c52 = \"link:\";\n  const peg$c53 = \"extref:\";\n  const peg$c54 = \"provider:\";\n  const peg$c55 = \"xref:\";\n  const peg$c56 = \"\\u25BA\";\n  const peg$c57 = \"symbol:\";\n  const peg$c58 = \"footnote:\";\n  const peg$c59 = \"footnote*:\";\n  const peg$c60 = \"var:\";\n  const peg$c61 = \"code:\";\n  const peg$c62 = \"timer\";\n  const peg$c63 = \"duration:\";\n  const peg$c64 = \"P\";\n  const peg$c65 = \"timer:\";\n  const peg$c66 = \"highlight\";\n  const peg$c67 = \"color:\";\n  const peg$c68 = \"userHighlight\";\n  const peg$c69 = \"colorPicker:\";\n  const peg$c70 = \"|\\u25BA\";\n  const peg$c71 = \"bold\";\n  const peg$c72 = \"italic\";\n  const peg$c73 = \"light\";\n  const peg$c74 = \"highlightOrange\";\n  const peg$c75 = \"highlightYellow\";\n  const peg$c76 = \"highlightGreen\";\n  const peg$c77 = \"highlightBlue\";\n  const peg$c78 = \"highlightPurple\";\n  const peg$c79 = \"highlightPink\";\n  const peg$c80 = \"highlightBrown\";\n  const peg$c81 = \"highlightBlack\";\n  const peg$c82 = \"highlightWhite\";\n  const peg$c83 = \"highlightGray\";\n  const peg$c84 = \"strike\";\n  const peg$c85 = \"subscript\";\n  const peg$c86 = \"superscript\";\n  const peg$c87 = \"ins\";\n  const peg$c88 = \"del\";\n  const peg$c89 = \"underline\";\n  const peg$c90 = \"doubleUnderline\";\n  const peg$c91 = \"smallcaps\";\n  const peg$c92 = \"circle\";\n  const peg$c93 = \"languageEmRed\";\n  const peg$c94 = \"languageEmOrange\";\n  const peg$c95 = \"languageEmYellow\";\n  const peg$c96 = \"languageEmGreen\";\n  const peg$c97 = \"languageEmBlue\";\n  const peg$c98 = \"languageEmPurple\";\n  const peg$c99 = \"languageEmPink\";\n  const peg$c100 = \"languageEmBrown\";\n  const peg$c101 = \"languageEmBlack\";\n  const peg$c102 = \"languageEmWhite\";\n  const peg$c103 = \"languageEmGray\";\n  const peg$c104 = \"languageEm\";\n  const peg$c105 = \"userUnderline\";\n  const peg$c106 = \"userDoubleUnderline\";\n  const peg$c107 = \"userStrike\";\n  const peg$c108 = \"userCircle\";\n  const peg$c109 = \"notranslate\";\n  const peg$c110 = \"aqua\";\n  const peg$c111 = \"black\";\n  const peg$c112 = \"blue\";\n  const peg$c113 = \"brown\";\n  const peg$c114 = \"fuchsia\";\n  const peg$c115 = \"lightgrey\";\n  const peg$c116 = \"gray\";\n  const peg$c117 = \"darkgray\";\n  const peg$c118 = \"green\";\n  const peg$c119 = \"lime\";\n  const peg$c120 = \"magenta\";\n  const peg$c121 = \"maroon\";\n  const peg$c122 = \"navy\";\n  const peg$c123 = \"olive\";\n  const peg$c124 = \"orange\";\n  const peg$c125 = \"pink\";\n  const peg$c126 = \"purple\";\n  const peg$c127 = \"red\";\n  const peg$c128 = \"silver\";\n  const peg$c129 = \"teal\";\n  const peg$c130 = \"violet\";\n  const peg$c131 = \"white\";\n  const peg$c132 = \"yellow\";\n  const peg$c133 = \"*\";\n  const peg$c134 = \"_\";\n  const peg$c135 = \"`\";\n  const peg$c136 = \"!\";\n  const peg$c137 = \"[!\";\n  const peg$c138 = \"]\";\n  const peg$c139 = \"\\n\";\n  const peg$c140 = \"\\r\\n\";\n  const peg$c141 = \"http\";\n  const peg$c142 = \"s\";\n  const peg$c143 = \"://\";\n  const peg$c144 = \"mailto:\";\n\n  const peg$r0 = /^[ \\t]/;\n  const peg$r1 = /^[0-9]/;\n  const peg$r2 = /^[\\r\\u2028-\\u2029]/;\n  const peg$r3 = /^[^\\n\\r\\u2028\\u2029]/;\n  const peg$r4 = /^[!#-;=?-[\\]-_a-{}-~]/;\n\n  const peg$e0 = peg$anyExpectation();\n  const peg$e1 = peg$otherExpectation(\"StyledText\");\n  const peg$e2 = peg$literalExpectation(\"|\", false);\n  const peg$e3 = peg$literalExpectation(\"### \", false);\n  const peg$e4 = peg$literalExpectation(\"## \", false);\n  const peg$e5 = peg$literalExpectation(\"# \", false);\n  const peg$e6 = peg$literalExpectation(\"code\", false);\n  const peg$e7 = peg$classExpectation([\" \", \"\\t\"], false, false, false);\n  const peg$e8 = peg$literalExpectation(\":\", false);\n  const peg$e9 = peg$literalExpectation(\"bitmark++\", false);\n  const peg$e10 = peg$literalExpectation(\"bitmark--\", false);\n  const peg$e11 = peg$literalExpectation(\"JavaScript\", false);\n  const peg$e12 = peg$literalExpectation(\"\\u2022 \", false);\n  const peg$e13 = peg$literalExpectation(\"\\u2022_ \", false);\n  const peg$e14 = peg$literalExpectation(\"\\u2022\", false);\n  const peg$e15 = peg$classExpectation([[\"0\", \"9\"]], false, false, false);\n  const peg$e16 = peg$literalExpectation(\" \", false);\n  const peg$e17 = peg$literalExpectation(\"I \", false);\n  const peg$e18 = peg$literalExpectation(\"i \", false);\n  const peg$e19 = peg$literalExpectation(\"\\u2022A \", false);\n  const peg$e20 = peg$literalExpectation(\"\\u2022a \", false);\n  const peg$e21 = peg$literalExpectation(\"\\u2022+ \", false);\n  const peg$e22 = peg$literalExpectation(\"\\u2022- \", false);\n  const peg$e23 = peg$literalExpectation(\"\\t\", false);\n  const peg$e24 = peg$literalExpectation(\"image\", false);\n  const peg$e25 = peg$literalExpectation(\"#\", false);\n  const peg$e26 = peg$literalExpectation(\"@\", false);\n  const peg$e27 = peg$literalExpectation(\"width\", false);\n  const peg$e28 = peg$literalExpectation(\"height\", false);\n  const peg$e29 = peg$literalExpectation(\"alignment\", false);\n  const peg$e30 = peg$literalExpectation(\"captionAlign\", false);\n  const peg$e31 = peg$literalExpectation(\"left\", false);\n  const peg$e32 = peg$literalExpectation(\"center\", false);\n  const peg$e33 = peg$literalExpectation(\"right\", false);\n  const peg$e34 = peg$literalExpectation(\"alt\", false);\n  const peg$e35 = peg$literalExpectation(\"caption\", false);\n  const peg$e36 = peg$literalExpectation(\"zoomDisabled\", false);\n  const peg$e37 = peg$literalExpectation(\"true\", false);\n  const peg$e38 = peg$literalExpectation(\"false\", false);\n  const peg$e39 = peg$literalExpectation(\"=\", false);\n  const peg$e40 = peg$literalExpectation(\"|latex|\", false);\n  const peg$e41 = peg$literalExpectation(\"|imageInline:\", false);\n  const peg$e42 = peg$literalExpectation(\"srcAlt\", false);\n  const peg$e43 = peg$literalExpectation(\"alignmentVertical\", false);\n  const peg$e44 = peg$literalExpectation(\"size\", false);\n  const peg$e45 = peg$literalExpectation(\"top\", false);\n  const peg$e46 = peg$literalExpectation(\"middle\", false);\n  const peg$e47 = peg$literalExpectation(\"bottom\", false);\n  const peg$e48 = peg$literalExpectation(\"baseline\", false);\n  const peg$e49 = peg$literalExpectation(\"sub\", false);\n  const peg$e50 = peg$literalExpectation(\"super\", false);\n  const peg$e51 = peg$literalExpectation(\"text-bottom\", false);\n  const peg$e52 = peg$literalExpectation(\"text-top\", false);\n  const peg$e53 = peg$literalExpectation(\"line-height\", false);\n  const peg$e54 = peg$literalExpectation(\"font-height\", false);\n  const peg$e55 = peg$literalExpectation(\"explicit\", false);\n  const peg$e56 = peg$literalExpectation(\"link:\", false);\n  const peg$e57 = peg$literalExpectation(\"extref:\", false);\n  const peg$e58 = peg$literalExpectation(\"provider:\", false);\n  const peg$e59 = peg$literalExpectation(\"xref:\", false);\n  const peg$e60 = peg$literalExpectation(\"\\u25BA\", false);\n  const peg$e61 = peg$literalExpectation(\"symbol:\", false);\n  const peg$e62 = peg$literalExpectation(\"footnote:\", false);\n  const peg$e63 = peg$literalExpectation(\"footnote*:\", false);\n  const peg$e64 = peg$literalExpectation(\"var:\", false);\n  const peg$e65 = peg$literalExpectation(\"code:\", false);\n  const peg$e66 = peg$literalExpectation(\"timer\", false);\n  const peg$e67 = peg$literalExpectation(\"duration:\", false);\n  const peg$e68 = peg$literalExpectation(\"P\", false);\n  const peg$e69 = peg$literalExpectation(\"timer:\", false);\n  const peg$e70 = peg$literalExpectation(\"highlight\", false);\n  const peg$e71 = peg$literalExpectation(\"color:\", false);\n  const peg$e72 = peg$literalExpectation(\"userHighlight\", false);\n  const peg$e73 = peg$literalExpectation(\"colorPicker:\", false);\n  const peg$e74 = peg$literalExpectation(\"|\\u25BA\", false);\n  const peg$e75 = peg$literalExpectation(\"bold\", false);\n  const peg$e76 = peg$literalExpectation(\"italic\", false);\n  const peg$e77 = peg$literalExpectation(\"light\", false);\n  const peg$e78 = peg$literalExpectation(\"highlightOrange\", false);\n  const peg$e79 = peg$literalExpectation(\"highlightYellow\", false);\n  const peg$e80 = peg$literalExpectation(\"highlightGreen\", false);\n  const peg$e81 = peg$literalExpectation(\"highlightBlue\", false);\n  const peg$e82 = peg$literalExpectation(\"highlightPurple\", false);\n  const peg$e83 = peg$literalExpectation(\"highlightPink\", false);\n  const peg$e84 = peg$literalExpectation(\"highlightBrown\", false);\n  const peg$e85 = peg$literalExpectation(\"highlightBlack\", false);\n  const peg$e86 = peg$literalExpectation(\"highlightWhite\", false);\n  const peg$e87 = peg$literalExpectation(\"highlightGray\", false);\n  const peg$e88 = peg$literalExpectation(\"strike\", false);\n  const peg$e89 = peg$literalExpectation(\"subscript\", false);\n  const peg$e90 = peg$literalExpectation(\"superscript\", false);\n  const peg$e91 = peg$literalExpectation(\"ins\", false);\n  const peg$e92 = peg$literalExpectation(\"del\", false);\n  const peg$e93 = peg$literalExpectation(\"underline\", false);\n  const peg$e94 = peg$literalExpectation(\"doubleUnderline\", false);\n  const peg$e95 = peg$literalExpectation(\"smallcaps\", false);\n  const peg$e96 = peg$literalExpectation(\"circle\", false);\n  const peg$e97 = peg$literalExpectation(\"languageEmRed\", false);\n  const peg$e98 = peg$literalExpectation(\"languageEmOrange\", false);\n  const peg$e99 = peg$literalExpectation(\"languageEmYellow\", false);\n  const peg$e100 = peg$literalExpectation(\"languageEmGreen\", false);\n  const peg$e101 = peg$literalExpectation(\"languageEmBlue\", false);\n  const peg$e102 = peg$literalExpectation(\"languageEmPurple\", false);\n  const peg$e103 = peg$literalExpectation(\"languageEmPink\", false);\n  const peg$e104 = peg$literalExpectation(\"languageEmBrown\", false);\n  const peg$e105 = peg$literalExpectation(\"languageEmBlack\", false);\n  const peg$e106 = peg$literalExpectation(\"languageEmWhite\", false);\n  const peg$e107 = peg$literalExpectation(\"languageEmGray\", false);\n  const peg$e108 = peg$literalExpectation(\"languageEm\", false);\n  const peg$e109 = peg$literalExpectation(\"userUnderline\", false);\n  const peg$e110 = peg$literalExpectation(\"userDoubleUnderline\", false);\n  const peg$e111 = peg$literalExpectation(\"userStrike\", false);\n  const peg$e112 = peg$literalExpectation(\"userCircle\", false);\n  const peg$e113 = peg$literalExpectation(\"notranslate\", false);\n  const peg$e114 = peg$literalExpectation(\"aqua\", false);\n  const peg$e115 = peg$literalExpectation(\"black\", false);\n  const peg$e116 = peg$literalExpectation(\"blue\", false);\n  const peg$e117 = peg$literalExpectation(\"brown\", false);\n  const peg$e118 = peg$literalExpectation(\"fuchsia\", false);\n  const peg$e119 = peg$literalExpectation(\"lightgrey\", false);\n  const peg$e120 = peg$literalExpectation(\"gray\", false);\n  const peg$e121 = peg$literalExpectation(\"darkgray\", false);\n  const peg$e122 = peg$literalExpectation(\"green\", false);\n  const peg$e123 = peg$literalExpectation(\"lime\", false);\n  const peg$e124 = peg$literalExpectation(\"magenta\", false);\n  const peg$e125 = peg$literalExpectation(\"maroon\", false);\n  const peg$e126 = peg$literalExpectation(\"navy\", false);\n  const peg$e127 = peg$literalExpectation(\"olive\", false);\n  const peg$e128 = peg$literalExpectation(\"orange\", false);\n  const peg$e129 = peg$literalExpectation(\"pink\", false);\n  const peg$e130 = peg$literalExpectation(\"purple\", false);\n  const peg$e131 = peg$literalExpectation(\"red\", false);\n  const peg$e132 = peg$literalExpectation(\"silver\", false);\n  const peg$e133 = peg$literalExpectation(\"teal\", false);\n  const peg$e134 = peg$literalExpectation(\"violet\", false);\n  const peg$e135 = peg$literalExpectation(\"white\", false);\n  const peg$e136 = peg$literalExpectation(\"yellow\", false);\n  const peg$e137 = peg$literalExpectation(\"*\", false);\n  const peg$e138 = peg$literalExpectation(\"_\", false);\n  const peg$e139 = peg$literalExpectation(\"`\", false);\n  const peg$e140 = peg$literalExpectation(\"!\", false);\n  const peg$e141 = peg$literalExpectation(\"[!\", false);\n  const peg$e142 = peg$literalExpectation(\"]\", false);\n  const peg$e143 = peg$otherExpectation(\"Line Terminator\");\n  const peg$e144 = peg$literalExpectation(\"\\n\", false);\n  const peg$e145 = peg$literalExpectation(\"\\r\\n\", false);\n  const peg$e146 = peg$classExpectation([\"\\r\", [\"\\u2028\", \"\\u2029\"]], false, false, false);\n  const peg$e147 = peg$classExpectation([\"\\n\", \"\\r\", \"\\u2028\", \"\\u2029\"], true, false, false);\n  const peg$e148 = peg$literalExpectation(\"http\", false);\n  const peg$e149 = peg$literalExpectation(\"s\", false);\n  const peg$e150 = peg$literalExpectation(\"://\", false);\n  const peg$e151 = peg$literalExpectation(\"mailto:\", false);\n  const peg$e152 = peg$classExpectation([\"!\", [\"#\", \";\"], \"=\", [\"?\", \"[\"], [\"]\", \"_\"], [\"a\", \"{\"], [\"}\", \"~\"]], false, false, false);\n\n  function peg$f0() {    return VERSION  }\n  function peg$f1(b) {    const cleaned_ = cleanEmptyTextNodes({ ...b }); return cleaned_  }\n  function peg$f2(b) {    let lb_ = { ...b }; removeTempParsingParent(lb_); const cleaned_ = cleanEmptyTextNodes(lb_); return cleaned_  }\n  function peg$f3(b) {    return { ...b }  }\n  function peg$f4(b) {    return { ...b }  }\n  function peg$f5(b) {    const cleaned_ = cleanEmptyTextNodes({ ...b }); return cleaned_  }\n  function peg$f6() {    return []  }\n  function peg$f7(h, t) {    return { type: \"heading\", content: bitmarkPlusString(t), attrs: { level: h.length - 1 } }  }\n  function peg$f8(t) {    return t  }\n  function peg$f9(h, b) {    return { ...h, content: b }  }\n  function peg$f10() {    return { type: \"codeBlock\", language: \"\" }  }\n  function peg$f11(l) {    return { type: \"codeBlock\", attrs: { language: l.trim().toLowerCase() } }  }\n  function peg$f12(c) {    return [{ type: \"text\", text: unbreakscape(c.trim())}]  }\n  function peg$f13(t) {    return t  }\n  function peg$f14(c, bl) {    return { ...c, content: bl, attrs: {} }  }\n  function peg$f15(c, bl) {    return { ...c, content: bl, attrs: {} }  }\n  function peg$f16(c, bl) {    let start = bl[0]._tempListStart; return { ...c, attrs: { start }, content: bl }  }\n  function peg$f17(c, bl) {    let start = bl[0]._tempListStart; return { ...c, attrs: { start }, content: bl }  }\n  function peg$f18(c, bl) {    let start = bl[0]._tempListStart; return { ...c, attrs: { start }, content: bl }  }\n  function peg$f19(c, bl) {    return { ...c, content: bl, attrs: {} }  }\n  function peg$f20(c, bl) {    return { ...c, content: bl, attrs: {} }  }\n  function peg$f21(c, bl) {    return { ...c, content: bl, attrs: {} }  }\n  function peg$f22() {    return { type: \"bulletList\" }  }\n  function peg$f23() {    return { type: \"noBulletList\" }  }\n  function peg$f24() {    return { type: \"orderedList\" }  }\n  function peg$f25() {    return { type: \"orderedListRoman\" }  }\n  function peg$f26() {    return { type: \"orderedListRomanLower\" }  }\n  function peg$f27() {    return { type: \"letteredList\" }  }\n  function peg$f28() {    return { type: \"letteredListLower\" }  }\n  function peg$f29() {    return { type: \"taskList\" }  }\n  function peg$f30(lt, listItem, lines, c) {    return c  }\n  function peg$f31(lt, listItem, lines, children) {\n\n    let _tempParsingParent = 'bulletList'\n\n    const matchOrdered = lt.match(/•([0-9]+)([Ii]?) /)\n\n    let start = 1\n\n    if (matchOrdered) {\n      _tempParsingParent = 'orderedList'\n      if (matchOrdered.length > 1) {\n          start = Number(matchOrdered[1])\n      }\n\n      if (matchOrdered.length > 2) {\n          let roman = matchOrdered[2]\n\t\t\tif ('I' == roman) {\n\t\t\t\t_tempParsingParent = 'orderedListRoman'\n\t\t\t}\n\t\t\tif ('i' == roman) {\n\t\t\t\t_tempParsingParent = 'orderedListRomanLower'\n\t\t\t}\n      }\n    }\n\n    if ('•_ ' == lt) {\n      _tempParsingParent = 'noBulletList'\n    }\n    if ('•A ' == lt) {\n      _tempParsingParent = 'letteredList'\n    }\n\t  if ('•a ' == lt) {\n      _tempParsingParent = 'letteredListLower'\n    }\n    if ('•+ ' == lt || '•- ' == lt ) {\n      _tempParsingParent = 'taskList'\n    }\n\n\t  let li = (listItem + lines.join(\"\")).trim()\n\n    let item = {\n    \ttype: \"paragraph\",\n\t\t    attrs: {},\n\t\t    content: bitmarkPlusString(li)\n    }\n\n\t  let content = [item]\n\n    if (children && children[0] && children[0]._tempParsingParent) {\n\n      let sublist = {\n        type: children[0]._tempParsingParent,\n        attrs: { start },\n        content: children\n      }\n\n      if (sublist.type.startsWith(\"orderedList\") || sublist.type.startsWith(\"letteredList\")) {\n\t      \tif (children[0]._tempListStart) {\n          \tconst start = children[0]._tempListStart\n\t\t\t\tif (start > 1) sublist.attrs.start = start\n          }\n      }\n\n      content.push(sublist)\n    }\n\n    let t = \"listItem\"\n    let attrs = null\n\n     if (\"taskList\" == _tempParsingParent) {\n      t = \"taskItem\"\n      let checked = false\n      if ('•+ ' == lt) {\n        checked = true\n      }\n      attrs = { checked }\n    }\n\n    const _tempListStart = start\n\n    if (attrs) {\n          return { type: t, attrs, content, _tempParsingParent, _tempListStart }\n    } else {\n          return { type: t, content, _tempParsingParent, _tempListStart }\n    }\n  }\n  function peg$f32(ll) {    return ll  }\n  function peg$f33(i) {    return i.join(\"\") === indent  }\n  function peg$f34(i) {    return i.length > indent.length  }\n  function peg$f35(i) {    indentStack.push(indent); indent = i.join(\"\")  }\n  function peg$f36() {    indent = indentStack.pop(); return true  }\n  function peg$f37(body) {    return { type: \"paragraph\", content: bitmarkPlusString(body.trim()), attrs: { } }  }\n  function peg$f38(body) {    return { type: \"paragraph\", content: bitmarkPlusString(body.trim()), attrs: { } }  }\n  function peg$f39(body) {    return { type: \"paragraph\", content: bitmarkPlusString(body.trim()), attrs: { } }  }\n  function peg$f40(t) {    return t  }\n  function peg$f41(t, u, ch) {\n\n    const chain = Object.assign({}, ...ch)\n\n    let imageAlignment_ = chain.alignment || \"center\"; delete chain.alignment\n    let textAlign_ = chain.captionAlign || \"left\"; delete chain.captionAlign\n    let alt_ = chain.alt || null; delete chain.alt\n    let title_ = chain.caption || null; delete chain.caption\n    let class_ = chain.align || \"center\"; delete chain.align\n    let zoomDisabled_ = chain.zoomDisabled === undefined ? true\n    \t: typeof chain.zoomDisabled === 'boolean' ? chain.zoomDisabled\n    \t: String(chain.zoomDisabled).toLowerCase() === 'true'; delete chain.zoomDisabled\n\n    let image = {\n      type: t,\n      attrs: {\n        alignment: imageAlignment_,\n        textAlign: textAlign_,\n        src: u,\n        alt: unbreakscape(alt_),\n        title: unbreakscape(title_),\n        class: class_,\n        zoomDisabled: zoomDisabled_,\n        ...chain\n      }\n    }\n\n    return image\n  }\n  function peg$f42(ch) {    return ch  }\n  function peg$f43(str) {return { comment: str.trim() }  }\n  function peg$f44(p, v) {    return { [p]: parseInt(v) }  }\n  function peg$f45(p, v) {    return { [p]: v.trim() }  }\n  function peg$f46(p, v) {    return { [p]: v }  }\n  function peg$f47(p, v) {    return { [p]: v }  }\n  function peg$f48(p) {    return { [p]: true }  }\n  function peg$f49() {    return  }\n  function peg$f50(p) {    return { error: 'Found unknown property or invalid value: '+ p }  }\n  function peg$f51(bs) {    return [ { type: 'paragraph', content: bs, attrs: { } } ]  }\n  function peg$f52(first, more) {    const cleaned_ = cleanEmptyTextNodes(first ? [first, ...more.flat()] : more.flat()); return cleaned_  }\n  function peg$f53() {    return { \"type\": \"hardBreak\" }  }\n  function peg$f54(t) {    return { text: unbreakscape(t), type: \"text\" }  }\n  function peg$f55(t) {    return { index: +t, type: \"bit\" }  }\n  function peg$f56(t) {    return { attrs: { formula: unbreakscape(t)}, type: \"latex\" }  }\n  function peg$f57(alt, u, ch) {    return { attrs: { alt, src: (u.pr + u.t).trim(), 'alignmentVertical': 'top' , size: 'line-height', ...Object.assign({}, ...ch), zoomDisabled: true }, type: \"imageInline\" }  }\n  function peg$f58(t, marks) {    if (!marks) marks = []; return { marks, text: unbreakscape(t), type: \"text\" }  }\n  function peg$f59(t) {    return { marks: [{type: \"bold\"}], text: unbreakscape(t), type: \"text\" }  }\n  function peg$f60(t) {    return { marks: [{type: \"italic\"}], text: unbreakscape(t), type: \"text\" }  }\n  function peg$f61(t) {    return { marks: [{type: \"light\"}], text: unbreakscape(t), type: \"text\" }  }\n  function peg$f62(t) {    return { marks: [{type: \"highlight\"}], text: unbreakscape(t), type: \"text\" }  }\n  function peg$f63(u) {    return { marks: [{ type: \"link\", attrs: { href: (u.pr + u.t).trim(), target: '_blank' } }], text: u.t, type: \"text\" }  }\n  function peg$f64(ch) {    return ch  }\n  function peg$f65(ch) {    return ch  }\n  function peg$f66(str) {return { comment: str }  }\n  function peg$f67(p, v) {return { [p]: v }  }\n  function peg$f68(p, v) {    return { [p]: parseInt(v) }  }\n  function peg$f69(p, v) {    return { type: \"error\", msg: p + ' must be a positive integer.', found: v }  }\n  function peg$f70(p, v) {    return { [p]: v }  }\n  function peg$f71(p, v) {    return { [p]: v }  }\n  function peg$f72(str) {return { type: 'link', attrs: { href: str.trim(), target: '_blank' } }  }\n  function peg$f73(str, rc, p) {return { type: 'extref', attrs: { extref: str.trim(), references: rc, provider: p.trim() } }  }\n  function peg$f74(str, str2) {return { type: 'xref', attrs: { xref: str.trim(), reference: str2.trim() } }  }\n  function peg$f75(str) {return { type: 'xref', attrs: { xref: str.trim(), reference: '' } }  }\n  function peg$f76(str) {return { type: 'ref', attrs: { reference: str.trim() } }  }\n  function peg$f77(str, ch) {const chain = Object.assign({}, ...ch); return { type: 'symbol', attrs: { src: str.trim(), ...chain } }  }\n  function peg$f78(str) {return { type: 'footnote', attrs: { content: bitmarkPlusString(str.trim()) } }  }\n  function peg$f79(str) {return { type: 'footnote*', attrs: { content: bitmarkPlusString(str.trim()) } }  }\n  function peg$f80(str) {return { type: 'var', attrs: { name: str.trim() } }  }\n  function peg$f81() {return { type: 'code', attrs: { language: \"plain text\" } }  }\n  function peg$f82(lang) {return { type: 'code', attrs: { language: lang.trim().toLowerCase() } }  }\n  function peg$f83(d) {return { type: 'timer', attrs: { name: \"\", duration: d.trim() } }  }\n  function peg$f84(str, d) {return { type: 'timer', attrs: { name: str.trim() , duration: d.trim() } }  }\n  function peg$f85(color) {return { type: 'highlight', attrs: { color } }  }\n  function peg$f86(color) {return { type: 'userHighlight', attrs: { color } }  }\n  function peg$f87(color) {return { type: 'textStyle', attrs: { color } }  }\n  function peg$f88(str) {return { type: 'colorPicker', attrs: { propertyRef: str.trim() } }  }\n  function peg$f89(style) {return { type: style }  }\n  function peg$f90(str) {return { type: \"comment\", comment: str }  }\n  function peg$f91(r) {    return r.trim()  }\n  function peg$f92(bs) {    return [ { type: 'paragraph', content: bs, attrs: { } } ]  }\n  function peg$f93(first, more) {    const cleaned_ = cleanEmptyTextNodes(first ? [first, ...more.flat()] : more.flat()); return cleaned_  }\n  function peg$f94() {    return { \"type\": \"hardBreak\" }  }\n  function peg$f95(t) {    return { text: unbreakscape(t), type: \"text\" }  }\n  function peg$f96(t) {    return { index: +t, type: \"bit\" }  }\n  function peg$f97(t) {    return { marks: [{type: \"bold\"}], text: unbreakscape(t), type: \"text\" }  }\n  function peg$f98(t) {    return { marks: [{type: \"italic\"}], text: unbreakscape(t), type: \"text\" }  }\n  function peg$f99(t) {    return { marks: [{type: \"light\"}], text: unbreakscape(t), type: \"text\" }  }\n  function peg$f100(t) {    return { marks: [{type: \"highlight\"}], text: unbreakscape(t), type: \"text\" }  }\n  function peg$f101(pr, t) {    return { pr, t}  }\n  let peg$currPos = options.peg$currPos | 0;\n  let peg$savedPos = peg$currPos;\n  const peg$posDetailsCache = [{ line: 1, column: 1 }];\n  let peg$maxFailPos = peg$currPos;\n  let peg$maxFailExpected = options.peg$maxFailExpected || [];\n  let peg$silentFails = options.peg$silentFails | 0;\n\n  let peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos,\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$getUnicode(pos = peg$currPos) {\n    const cp = input.codePointAt(pos);\n    if (cp === undefined) {\n      return \"\";\n    }\n    return String.fromCodePoint(cp);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text, ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase, unicode) {\n    return { type: \"class\", parts, inverted, ignoreCase, unicode };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description };\n  }\n\n  function peg$computePosDetails(pos) {\n    let details = peg$posDetailsCache[pos];\n    let p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column,\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    const startPosDetails = peg$computePosDetails(startPos);\n    const endPosDetails = peg$computePosDetails(endPos);\n\n    const res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column,\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column,\n      },\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parseversion() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    if (input.length > peg$currPos) {\n      s2 = input.charAt(peg$currPos);\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      if (input.length > peg$currPos) {\n        s2 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e0); }\n      }\n    }\n    peg$savedPos = s0;\n    s1 = peg$f0();\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parsebitmarkPlusPlus() {\n    let s0, s1;\n\n    peg$silentFails++;\n    s0 = [];\n    s1 = peg$parseBlock();\n    if (s1 !== peg$FAILED) {\n      while (s1 !== peg$FAILED) {\n        s0.push(s1);\n        s1 = peg$parseBlock();\n      }\n    } else {\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseNoContent();\n    }\n    peg$silentFails--;\n    if (s0 === peg$FAILED) {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e1); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlock() {\n    let s0, s1;\n\n    s0 = peg$currPos;\n    s1 = peg$parseTitleBlock();\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f1(s1);\n    }\n    s0 = s1;\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseListBlock();\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f2(s1);\n      }\n      s0 = s1;\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parseImageBlock();\n        if (s1 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s1 = peg$f3(s1);\n        }\n        s0 = s1;\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          s1 = peg$parseCodeBlock();\n          if (s1 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s1 = peg$f4(s1);\n          }\n          s0 = s1;\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            s1 = peg$parseParagraph();\n            if (s1 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s1 = peg$f5(s1);\n            }\n            s0 = s1;\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlockStart() {\n    let s0;\n\n    s0 = peg$parseTitleTags();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseListTags();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseImageBlock();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseCodeHeader();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parseExplicitParagraphHeader();\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlockTag() {\n    let s0;\n\n    if (input.charCodeAt(peg$currPos) === 124) {\n      s0 = peg$c0;\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseNoContent() {\n    let s0, s1;\n\n    s0 = peg$currPos;\n    s1 = '';\n    peg$savedPos = s0;\n    s1 = peg$f6();\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseTitleTags() {\n    let s0;\n\n    if (input.substr(peg$currPos, 4) === peg$c1) {\n      s0 = peg$c1;\n      peg$currPos += 4;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 3) === peg$c2) {\n        s0 = peg$c2;\n        peg$currPos += 3;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e4); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 2) === peg$c3) {\n          s0 = peg$c3;\n          peg$currPos += 2;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e5); }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseTitleBlock() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$parseTitleTags();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = peg$parsechar();\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$parsechar();\n      }\n      s2 = input.substring(s2, peg$currPos);\n      s3 = peg$parseEOL();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseNL();\n        if (s4 === peg$FAILED) {\n          s4 = null;\n        }\n        peg$savedPos = s0;\n        s0 = peg$f7(s1, s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseCodeType() {\n    let s0;\n\n    if (input.substr(peg$currPos, 4) === peg$c4) {\n      s0 = peg$c4;\n      peg$currPos += 4;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseCodeTag() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseBlockTag();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseCodeType();\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f8(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseCodeBlock() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseCodeHeader();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseCodeBody();\n      peg$savedPos = s0;\n      s0 = peg$f9(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseCodeHeader() {\n    let s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parseCodeTag();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = peg$currPos;\n      s4 = [];\n      s5 = input.charAt(peg$currPos);\n      if (peg$r0.test(s5)) {\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e7); }\n      }\n      while (s5 !== peg$FAILED) {\n        s4.push(s5);\n        s5 = input.charAt(peg$currPos);\n        if (peg$r0.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e7); }\n        }\n      }\n      s5 = peg$parseEOL();\n      if (s5 !== peg$FAILED) {\n        s4 = [s4, s5];\n        s3 = s4;\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = input.substring(s2, peg$currPos);\n      } else {\n        s2 = s3;\n      }\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f10();\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseCodeTag();\n      if (s1 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 58) {\n          s2 = peg$c5;\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e8); }\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parseCodeLanguage();\n          if (s3 !== peg$FAILED) {\n            s4 = peg$currPos;\n            s5 = peg$currPos;\n            s6 = [];\n            s7 = input.charAt(peg$currPos);\n            if (peg$r0.test(s7)) {\n              peg$currPos++;\n            } else {\n              s7 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e7); }\n            }\n            while (s7 !== peg$FAILED) {\n              s6.push(s7);\n              s7 = input.charAt(peg$currPos);\n              if (peg$r0.test(s7)) {\n                peg$currPos++;\n              } else {\n                s7 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e7); }\n              }\n            }\n            s7 = peg$parseEOL();\n            if (s7 !== peg$FAILED) {\n              s6 = [s6, s7];\n              s5 = s6;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n            if (s5 !== peg$FAILED) {\n              s4 = input.substring(s4, peg$currPos);\n            } else {\n              s4 = s5;\n            }\n            if (s4 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f11(s3);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseCodeLanguage() {\n    let s0, s1, s2;\n\n    if (input.substr(peg$currPos, 9) === peg$c6) {\n      s0 = peg$c6;\n      peg$currPos += 9;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e9); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 9) === peg$c7) {\n        s0 = peg$c7;\n        peg$currPos += 9;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e10); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 10) === peg$c8) {\n          s0 = peg$c8;\n          peg$currPos += 10;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e11); }\n        }\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          s1 = [];\n          s2 = peg$parsechar();\n          if (s2 !== peg$FAILED) {\n            while (s2 !== peg$FAILED) {\n              s1.push(s2);\n              s2 = peg$parsechar();\n            }\n          } else {\n            s1 = peg$FAILED;\n          }\n          if (s1 !== peg$FAILED) {\n            s0 = input.substring(s0, peg$currPos);\n          } else {\n            s0 = s1;\n          }\n          if (s0 === peg$FAILED) {\n            s0 = '';\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseCodeBody() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = peg$parseCodeLine();\n    while (s3 !== peg$FAILED) {\n      s2.push(s3);\n      s3 = peg$parseCodeLine();\n    }\n    s1 = input.substring(s1, peg$currPos);\n    peg$savedPos = s0;\n    s1 = peg$f12(s1);\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseCodeLine() {\n    let s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$parseBlockStart();\n    peg$silentFails--;\n    if (s2 === peg$FAILED) {\n      s1 = undefined;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = peg$currPos;\n      s4 = [];\n      s5 = peg$parsechar();\n      if (s5 !== peg$FAILED) {\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$parsechar();\n        }\n      } else {\n        s4 = peg$FAILED;\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseEOL();\n        if (s5 !== peg$FAILED) {\n          s4 = [s4, s5];\n          s3 = s4;\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = input.substring(s2, peg$currPos);\n      } else {\n        s2 = s3;\n      }\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f13(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseNL();\n    }\n\n    return s0;\n  }\n\n  function peg$parseBulletListTag() {\n    let s0;\n\n    if (input.substr(peg$currPos, 2) === peg$c9) {\n      s0 = peg$c9;\n      peg$currPos += 2;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e12); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseNoBulletListTag() {\n    let s0;\n\n    if (input.substr(peg$currPos, 3) === peg$c10) {\n      s0 = peg$c10;\n      peg$currPos += 3;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseOrderedListTag() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 8226) {\n      s2 = peg$c11;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r1.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      if (s4 !== peg$FAILED) {\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = input.charAt(peg$currPos);\n          if (peg$r1.test(s4)) {\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e15); }\n          }\n        }\n      } else {\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 32) {\n          s4 = peg$c12;\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e16); }\n        }\n        if (s4 !== peg$FAILED) {\n          s2 = [s2, s3, s4];\n          s1 = s2;\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseOrderedListRomanTag() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 8226) {\n      s2 = peg$c11;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r1.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      if (s4 !== peg$FAILED) {\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = input.charAt(peg$currPos);\n          if (peg$r1.test(s4)) {\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e15); }\n          }\n        }\n      } else {\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        if (input.substr(peg$currPos, 2) === peg$c13) {\n          s4 = peg$c13;\n          peg$currPos += 2;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e17); }\n        }\n        if (s4 !== peg$FAILED) {\n          s2 = [s2, s3, s4];\n          s1 = s2;\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseOrderedListRomanLowerTag() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 8226) {\n      s2 = peg$c11;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r1.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      if (s4 !== peg$FAILED) {\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = input.charAt(peg$currPos);\n          if (peg$r1.test(s4)) {\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e15); }\n          }\n        }\n      } else {\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        if (input.substr(peg$currPos, 2) === peg$c14) {\n          s4 = peg$c14;\n          peg$currPos += 2;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e18); }\n        }\n        if (s4 !== peg$FAILED) {\n          s2 = [s2, s3, s4];\n          s1 = s2;\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLetteredListTag() {\n    let s0;\n\n    if (input.substr(peg$currPos, 3) === peg$c15) {\n      s0 = peg$c15;\n      peg$currPos += 3;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseLetteredListLowerTag() {\n    let s0;\n\n    if (input.substr(peg$currPos, 3) === peg$c16) {\n      s0 = peg$c16;\n      peg$currPos += 3;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e20); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseTaskListTag() {\n    let s0;\n\n    if (input.substr(peg$currPos, 3) === peg$c17) {\n      s0 = peg$c17;\n      peg$currPos += 3;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e21); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 3) === peg$c18) {\n        s0 = peg$c18;\n        peg$currPos += 3;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e22); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseListTags() {\n    let s0;\n\n    s0 = peg$parseBulletListTag();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseNoBulletListTag();\n      if (s0 === peg$FAILED) {\n        s0 = peg$parseOrderedListTag();\n        if (s0 === peg$FAILED) {\n          s0 = peg$parseOrderedListRomanTag();\n          if (s0 === peg$FAILED) {\n            s0 = peg$parseOrderedListRomanLowerTag();\n            if (s0 === peg$FAILED) {\n              s0 = peg$parseLetteredListTag();\n              if (s0 === peg$FAILED) {\n                s0 = peg$parseLetteredListLowerTag();\n                if (s0 === peg$FAILED) {\n                  s0 = peg$parseTaskListTag();\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseListBlock() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parseBulletListContainer();\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = peg$parseBulletListLine();\n      if (s3 !== peg$FAILED) {\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = peg$parseBulletListLine();\n        }\n      } else {\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseNL();\n        if (s3 === peg$FAILED) {\n          s3 = null;\n        }\n        peg$savedPos = s0;\n        s0 = peg$f14(s1, s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseNoBulletListContainer();\n      if (s1 !== peg$FAILED) {\n        s2 = [];\n        s3 = peg$parseBulletListLine();\n        if (s3 !== peg$FAILED) {\n          while (s3 !== peg$FAILED) {\n            s2.push(s3);\n            s3 = peg$parseBulletListLine();\n          }\n        } else {\n          s2 = peg$FAILED;\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parseNL();\n          if (s3 === peg$FAILED) {\n            s3 = null;\n          }\n          peg$savedPos = s0;\n          s0 = peg$f15(s1, s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parseOrderedListContainer();\n        if (s1 !== peg$FAILED) {\n          s2 = [];\n          s3 = peg$parseBulletListLine();\n          if (s3 !== peg$FAILED) {\n            while (s3 !== peg$FAILED) {\n              s2.push(s3);\n              s3 = peg$parseBulletListLine();\n            }\n          } else {\n            s2 = peg$FAILED;\n          }\n          if (s2 !== peg$FAILED) {\n            s3 = peg$parseNL();\n            if (s3 === peg$FAILED) {\n              s3 = null;\n            }\n            peg$savedPos = s0;\n            s0 = peg$f16(s1, s2);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          s1 = peg$parseOrderedListRomanContainer();\n          if (s1 !== peg$FAILED) {\n            s2 = [];\n            s3 = peg$parseBulletListLine();\n            if (s3 !== peg$FAILED) {\n              while (s3 !== peg$FAILED) {\n                s2.push(s3);\n                s3 = peg$parseBulletListLine();\n              }\n            } else {\n              s2 = peg$FAILED;\n            }\n            if (s2 !== peg$FAILED) {\n              s3 = peg$parseNL();\n              if (s3 === peg$FAILED) {\n                s3 = null;\n              }\n              peg$savedPos = s0;\n              s0 = peg$f17(s1, s2);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            s1 = peg$parseOrderedListRomanLowerContainer();\n            if (s1 !== peg$FAILED) {\n              s2 = [];\n              s3 = peg$parseBulletListLine();\n              if (s3 !== peg$FAILED) {\n                while (s3 !== peg$FAILED) {\n                  s2.push(s3);\n                  s3 = peg$parseBulletListLine();\n                }\n              } else {\n                s2 = peg$FAILED;\n              }\n              if (s2 !== peg$FAILED) {\n                s3 = peg$parseNL();\n                if (s3 === peg$FAILED) {\n                  s3 = null;\n                }\n                peg$savedPos = s0;\n                s0 = peg$f18(s1, s2);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n            if (s0 === peg$FAILED) {\n              s0 = peg$currPos;\n              s1 = peg$parseLetteredListContainer();\n              if (s1 !== peg$FAILED) {\n                s2 = [];\n                s3 = peg$parseBulletListLine();\n                if (s3 !== peg$FAILED) {\n                  while (s3 !== peg$FAILED) {\n                    s2.push(s3);\n                    s3 = peg$parseBulletListLine();\n                  }\n                } else {\n                  s2 = peg$FAILED;\n                }\n                if (s2 !== peg$FAILED) {\n                  s3 = peg$parseNL();\n                  if (s3 === peg$FAILED) {\n                    s3 = null;\n                  }\n                  peg$savedPos = s0;\n                  s0 = peg$f19(s1, s2);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n              if (s0 === peg$FAILED) {\n                s0 = peg$currPos;\n                s1 = peg$parseLetteredListLowerContainer();\n                if (s1 !== peg$FAILED) {\n                  s2 = [];\n                  s3 = peg$parseBulletListLine();\n                  if (s3 !== peg$FAILED) {\n                    while (s3 !== peg$FAILED) {\n                      s2.push(s3);\n                      s3 = peg$parseBulletListLine();\n                    }\n                  } else {\n                    s2 = peg$FAILED;\n                  }\n                  if (s2 !== peg$FAILED) {\n                    s3 = peg$parseNL();\n                    if (s3 === peg$FAILED) {\n                      s3 = null;\n                    }\n                    peg$savedPos = s0;\n                    s0 = peg$f20(s1, s2);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n                if (s0 === peg$FAILED) {\n                  s0 = peg$currPos;\n                  s1 = peg$parseTaskListContainer();\n                  if (s1 !== peg$FAILED) {\n                    s2 = [];\n                    s3 = peg$parseBulletListLine();\n                    if (s3 !== peg$FAILED) {\n                      while (s3 !== peg$FAILED) {\n                        s2.push(s3);\n                        s3 = peg$parseBulletListLine();\n                      }\n                    } else {\n                      s2 = peg$FAILED;\n                    }\n                    if (s2 !== peg$FAILED) {\n                      s3 = peg$parseNL();\n                      if (s3 === peg$FAILED) {\n                        s3 = null;\n                      }\n                      peg$savedPos = s0;\n                      s0 = peg$f21(s1, s2);\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseBulletListContainer() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$parseBulletListTag();\n    peg$silentFails--;\n    if (s2 !== peg$FAILED) {\n      peg$currPos = s1;\n      s1 = undefined;\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f22();\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseNoBulletListContainer() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$parseNoBulletListTag();\n    peg$silentFails--;\n    if (s2 !== peg$FAILED) {\n      peg$currPos = s1;\n      s1 = undefined;\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f23();\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseOrderedListContainer() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$parseOrderedListTag();\n    peg$silentFails--;\n    if (s2 !== peg$FAILED) {\n      peg$currPos = s1;\n      s1 = undefined;\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f24();\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseOrderedListRomanContainer() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$parseOrderedListRomanTag();\n    peg$silentFails--;\n    if (s2 !== peg$FAILED) {\n      peg$currPos = s1;\n      s1 = undefined;\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f25();\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseOrderedListRomanLowerContainer() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$parseOrderedListRomanLowerTag();\n    peg$silentFails--;\n    if (s2 !== peg$FAILED) {\n      peg$currPos = s1;\n      s1 = undefined;\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f26();\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseLetteredListContainer() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$parseLetteredListTag();\n    peg$silentFails--;\n    if (s2 !== peg$FAILED) {\n      peg$currPos = s1;\n      s1 = undefined;\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f27();\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseLetteredListLowerContainer() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$parseLetteredListLowerTag();\n    peg$silentFails--;\n    if (s2 !== peg$FAILED) {\n      peg$currPos = s1;\n      s1 = undefined;\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f28();\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseTaskListContainer() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$parseTaskListTag();\n    peg$silentFails--;\n    if (s2 !== peg$FAILED) {\n      peg$currPos = s1;\n      s1 = undefined;\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f29();\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseBulletListLine() {\n    let s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$parseSAMEDENT();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseListTags();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$currPos;\n        s4 = peg$currPos;\n        s5 = [];\n        s6 = peg$currPos;\n        s7 = peg$currPos;\n        peg$silentFails++;\n        s8 = peg$parseNL();\n        peg$silentFails--;\n        if (s8 === peg$FAILED) {\n          s7 = undefined;\n        } else {\n          peg$currPos = s7;\n          s7 = peg$FAILED;\n        }\n        if (s7 !== peg$FAILED) {\n          if (input.length > peg$currPos) {\n            s8 = input.charAt(peg$currPos);\n            peg$currPos++;\n          } else {\n            s8 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e0); }\n          }\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = peg$currPos;\n          s7 = peg$currPos;\n          peg$silentFails++;\n          s8 = peg$parseNL();\n          peg$silentFails--;\n          if (s8 === peg$FAILED) {\n            s7 = undefined;\n          } else {\n            peg$currPos = s7;\n            s7 = peg$FAILED;\n          }\n          if (s7 !== peg$FAILED) {\n            if (input.length > peg$currPos) {\n              s8 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s8 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e0); }\n            }\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        }\n        s6 = peg$parseNL();\n        if (s6 === peg$FAILED) {\n          s6 = null;\n        }\n        s5 = [s5, s6];\n        s4 = s5;\n        s3 = input.substring(s3, peg$currPos);\n        s4 = [];\n        s5 = peg$parseListLine();\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$parseListLine();\n        }\n        s5 = peg$currPos;\n        s6 = peg$parseINDENT();\n        if (s6 !== peg$FAILED) {\n          s7 = [];\n          s8 = peg$parseBulletListLine();\n          while (s8 !== peg$FAILED) {\n            s7.push(s8);\n            s8 = peg$parseBulletListLine();\n          }\n          s8 = peg$parseDEDENT();\n          if (s8 !== peg$FAILED) {\n            peg$savedPos = s5;\n            s5 = peg$f30(s2, s3, s4, s7);\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 === peg$FAILED) {\n          s5 = null;\n        }\n        peg$savedPos = s0;\n        s0 = peg$f31(s2, s3, s4, s5);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseListLine() {\n    let s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$parseBlankLine();\n    peg$silentFails--;\n    if (s2 === peg$FAILED) {\n      s1 = undefined;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseSAMEDENT();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$currPos;\n        peg$silentFails++;\n        s4 = peg$parseListTags();\n        peg$silentFails--;\n        if (s4 === peg$FAILED) {\n          s3 = undefined;\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n        if (s3 !== peg$FAILED) {\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          s6 = [];\n          s7 = peg$currPos;\n          s8 = peg$currPos;\n          peg$silentFails++;\n          s9 = peg$parseNL();\n          peg$silentFails--;\n          if (s9 === peg$FAILED) {\n            s8 = undefined;\n          } else {\n            peg$currPos = s8;\n            s8 = peg$FAILED;\n          }\n          if (s8 !== peg$FAILED) {\n            if (input.length > peg$currPos) {\n              s9 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s9 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e0); }\n            }\n            if (s9 !== peg$FAILED) {\n              s8 = [s8, s9];\n              s7 = s8;\n            } else {\n              peg$currPos = s7;\n              s7 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s7;\n            s7 = peg$FAILED;\n          }\n          if (s7 !== peg$FAILED) {\n            while (s7 !== peg$FAILED) {\n              s6.push(s7);\n              s7 = peg$currPos;\n              s8 = peg$currPos;\n              peg$silentFails++;\n              s9 = peg$parseNL();\n              peg$silentFails--;\n              if (s9 === peg$FAILED) {\n                s8 = undefined;\n              } else {\n                peg$currPos = s8;\n                s8 = peg$FAILED;\n              }\n              if (s8 !== peg$FAILED) {\n                if (input.length > peg$currPos) {\n                  s9 = input.charAt(peg$currPos);\n                  peg$currPos++;\n                } else {\n                  s9 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                }\n                if (s9 !== peg$FAILED) {\n                  s8 = [s8, s9];\n                  s7 = s8;\n                } else {\n                  peg$currPos = s7;\n                  s7 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s7;\n                s7 = peg$FAILED;\n              }\n            }\n          } else {\n            s6 = peg$FAILED;\n          }\n          if (s6 !== peg$FAILED) {\n            s7 = peg$parseEOL();\n            if (s7 !== peg$FAILED) {\n              s6 = [s6, s7];\n              s5 = s6;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s4 = input.substring(s4, peg$currPos);\n          } else {\n            s4 = s5;\n          }\n          if (s4 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f32(s4);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r0.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = input.charAt(peg$currPos);\n      if (peg$r0.test(s2)) {\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e7); }\n      }\n    }\n    s2 = peg$parseNL();\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseSAMEDENT() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    if (input.charCodeAt(peg$currPos) === 9) {\n      s2 = peg$c19;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e23); }\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      if (input.charCodeAt(peg$currPos) === 9) {\n        s2 = peg$c19;\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e23); }\n      }\n    }\n    peg$savedPos = peg$currPos;\n    s2 = peg$f33(s1);\n    if (s2) {\n      s2 = undefined;\n    } else {\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseINDENT() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    peg$silentFails++;\n    s1 = peg$currPos;\n    s2 = [];\n    if (input.charCodeAt(peg$currPos) === 9) {\n      s3 = peg$c19;\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e23); }\n    }\n    if (s3 !== peg$FAILED) {\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        if (input.charCodeAt(peg$currPos) === 9) {\n          s3 = peg$c19;\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e23); }\n        }\n      }\n    } else {\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      peg$savedPos = peg$currPos;\n      s3 = peg$f34(s2);\n      if (s3) {\n        s3 = undefined;\n      } else {\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s1;\n        s1 = peg$f35(s2);\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    peg$silentFails--;\n    if (s1 !== peg$FAILED) {\n      peg$currPos = s0;\n      s0 = undefined;\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseDEDENT() {\n    let s0;\n\n    peg$savedPos = peg$currPos;\n    s0 = peg$f36();\n    if (s0) {\n      s0 = undefined;\n    } else {\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseParagraph() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$parseBlockStart();\n    peg$silentFails--;\n    if (s2 === peg$FAILED) {\n      s1 = undefined;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseParagraphBody();\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f37(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseExplicitParagraphHeader();\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parseParagraphBody();\n        if (s2 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f38(s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parseExplicitParagraphHeader();\n        if (s1 !== peg$FAILED) {\n          s2 = '';\n          peg$savedPos = s0;\n          s0 = peg$f39(s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseParagraphBody() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseParagraphLine();\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = peg$parseParagraphLine();\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseParagraphLine() {\n    let s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$parseBlockStart();\n    peg$silentFails--;\n    if (s2 === peg$FAILED) {\n      s1 = undefined;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = peg$currPos;\n      s4 = [];\n      s5 = peg$parsechar();\n      if (s5 !== peg$FAILED) {\n        while (s5 !== peg$FAILED) {\n          s4.push(s5);\n          s5 = peg$parsechar();\n        }\n      } else {\n        s4 = peg$FAILED;\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseEOL();\n        if (s5 !== peg$FAILED) {\n          s4 = [s4, s5];\n          s3 = s4;\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = input.substring(s2, peg$currPos);\n      } else {\n        s2 = s3;\n      }\n      if (s2 !== peg$FAILED) {\n        s1 = [s1, s2];\n        s0 = s1;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$parseNL();\n    }\n\n    return s0;\n  }\n\n  function peg$parseExplicitParagraphHeader() {\n    let s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$parseBlockTag();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = peg$currPos;\n      s4 = [];\n      s5 = input.charAt(peg$currPos);\n      if (peg$r0.test(s5)) {\n        peg$currPos++;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e7); }\n      }\n      while (s5 !== peg$FAILED) {\n        s4.push(s5);\n        s5 = input.charAt(peg$currPos);\n        if (peg$r0.test(s5)) {\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e7); }\n        }\n      }\n      s5 = peg$parseEOL();\n      if (s5 !== peg$FAILED) {\n        s4 = [s4, s5];\n        s3 = s4;\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = input.substring(s2, peg$currPos);\n      } else {\n        s2 = s3;\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseNL();\n        if (s3 === peg$FAILED) {\n          s3 = null;\n        }\n        s1 = [s1, s2, s3];\n        s0 = s1;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseImageType() {\n    let s0;\n\n    if (input.substr(peg$currPos, 5) === peg$c20) {\n      s0 = peg$c20;\n      peg$currPos += 5;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e24); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseImageTag() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseBlockTag();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseImageType();\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f40(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseImageBlock() {\n    let s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;\n\n    s0 = peg$currPos;\n    s1 = peg$parseImageTag();\n    if (s1 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 58) {\n        s2 = peg$c5;\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e8); }\n      }\n      if (s2 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 32) {\n          s3 = peg$c12;\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e16); }\n        }\n        if (s3 === peg$FAILED) {\n          s3 = null;\n        }\n        s4 = peg$parseUrlHttp();\n        if (s4 !== peg$FAILED) {\n          s5 = [];\n          if (input.charCodeAt(peg$currPos) === 32) {\n            s6 = peg$c12;\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e16); }\n          }\n          while (s6 !== peg$FAILED) {\n            s5.push(s6);\n            if (input.charCodeAt(peg$currPos) === 32) {\n              s6 = peg$c12;\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e16); }\n            }\n          }\n          s6 = peg$parseBlockTag();\n          if (s6 !== peg$FAILED) {\n            s7 = peg$parseMediaChain();\n            s8 = peg$currPos;\n            s9 = peg$currPos;\n            s10 = [];\n            s11 = input.charAt(peg$currPos);\n            if (peg$r0.test(s11)) {\n              peg$currPos++;\n            } else {\n              s11 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e7); }\n            }\n            while (s11 !== peg$FAILED) {\n              s10.push(s11);\n              s11 = input.charAt(peg$currPos);\n              if (peg$r0.test(s11)) {\n                peg$currPos++;\n              } else {\n                s11 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e7); }\n              }\n            }\n            s11 = peg$parseEOL();\n            if (s11 !== peg$FAILED) {\n              s10 = [s10, s11];\n              s9 = s10;\n            } else {\n              peg$currPos = s9;\n              s9 = peg$FAILED;\n            }\n            if (s9 !== peg$FAILED) {\n              s8 = input.substring(s8, peg$currPos);\n            } else {\n              s8 = s9;\n            }\n            if (s8 !== peg$FAILED) {\n              s9 = peg$parseNL();\n              if (s9 === peg$FAILED) {\n                s9 = null;\n              }\n              peg$savedPos = s0;\n              s0 = peg$f41(s1, s4, s7);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseMediaChain() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseMediaChainItem();\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$parseMediaChainItem();\n    }\n    peg$savedPos = s0;\n    s1 = peg$f42(s1);\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseMediaChainItem() {\n    let s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 35) {\n      s1 = peg$c21;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e25); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = peg$currPos;\n      s5 = peg$currPos;\n      peg$silentFails++;\n      s6 = peg$parseBlockTag();\n      peg$silentFails--;\n      if (s6 === peg$FAILED) {\n        s5 = undefined;\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parsechar();\n        if (s6 !== peg$FAILED) {\n          s5 = [s5, s6];\n          s4 = s5;\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$parseBlockTag();\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parsechar();\n          if (s6 !== peg$FAILED) {\n            s5 = [s5, s6];\n            s4 = s5;\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      s3 = peg$parseBlockTag();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f43(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 64) {\n        s1 = peg$c22;\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e26); }\n      }\n      if (s1 === peg$FAILED) {\n        s1 = null;\n      }\n      s2 = peg$parseMediaSizeTags();\n      if (s2 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 58) {\n          s3 = peg$c5;\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e8); }\n        }\n        if (s3 !== peg$FAILED) {\n          s4 = [];\n          if (input.charCodeAt(peg$currPos) === 32) {\n            s5 = peg$c12;\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e16); }\n          }\n          while (s5 !== peg$FAILED) {\n            s4.push(s5);\n            if (input.charCodeAt(peg$currPos) === 32) {\n              s5 = peg$c12;\n              peg$currPos++;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e16); }\n            }\n          }\n          s5 = peg$currPos;\n          s6 = [];\n          s7 = peg$currPos;\n          s8 = peg$currPos;\n          peg$silentFails++;\n          s9 = peg$parseBlockTag();\n          peg$silentFails--;\n          if (s9 === peg$FAILED) {\n            s8 = undefined;\n          } else {\n            peg$currPos = s8;\n            s8 = peg$FAILED;\n          }\n          if (s8 !== peg$FAILED) {\n            s9 = input.charAt(peg$currPos);\n            if (peg$r1.test(s9)) {\n              peg$currPos++;\n            } else {\n              s9 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e15); }\n            }\n            if (s9 !== peg$FAILED) {\n              s8 = [s8, s9];\n              s7 = s8;\n            } else {\n              peg$currPos = s7;\n              s7 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s7;\n            s7 = peg$FAILED;\n          }\n          if (s7 !== peg$FAILED) {\n            while (s7 !== peg$FAILED) {\n              s6.push(s7);\n              s7 = peg$currPos;\n              s8 = peg$currPos;\n              peg$silentFails++;\n              s9 = peg$parseBlockTag();\n              peg$silentFails--;\n              if (s9 === peg$FAILED) {\n                s8 = undefined;\n              } else {\n                peg$currPos = s8;\n                s8 = peg$FAILED;\n              }\n              if (s8 !== peg$FAILED) {\n                s9 = input.charAt(peg$currPos);\n                if (peg$r1.test(s9)) {\n                  peg$currPos++;\n                } else {\n                  s9 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e15); }\n                }\n                if (s9 !== peg$FAILED) {\n                  s8 = [s8, s9];\n                  s7 = s8;\n                } else {\n                  peg$currPos = s7;\n                  s7 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s7;\n                s7 = peg$FAILED;\n              }\n            }\n          } else {\n            s6 = peg$FAILED;\n          }\n          if (s6 !== peg$FAILED) {\n            s5 = input.substring(s5, peg$currPos);\n          } else {\n            s5 = s6;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = [];\n            if (input.charCodeAt(peg$currPos) === 32) {\n              s7 = peg$c12;\n              peg$currPos++;\n            } else {\n              s7 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e16); }\n            }\n            while (s7 !== peg$FAILED) {\n              s6.push(s7);\n              if (input.charCodeAt(peg$currPos) === 32) {\n                s7 = peg$c12;\n                peg$currPos++;\n              } else {\n                s7 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e16); }\n              }\n            }\n            s7 = peg$parseBlockTag();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f44(s2, s5);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        if (input.charCodeAt(peg$currPos) === 64) {\n          s1 = peg$c22;\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e26); }\n        }\n        if (s1 === peg$FAILED) {\n          s1 = null;\n        }\n        s2 = peg$parseMediaTextTags();\n        if (s2 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 58) {\n            s3 = peg$c5;\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e8); }\n          }\n          if (s3 !== peg$FAILED) {\n            s4 = [];\n            if (input.charCodeAt(peg$currPos) === 32) {\n              s5 = peg$c12;\n              peg$currPos++;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e16); }\n            }\n            while (s5 !== peg$FAILED) {\n              s4.push(s5);\n              if (input.charCodeAt(peg$currPos) === 32) {\n                s5 = peg$c12;\n                peg$currPos++;\n              } else {\n                s5 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e16); }\n              }\n            }\n            s5 = peg$currPos;\n            s6 = [];\n            s7 = peg$currPos;\n            s8 = peg$currPos;\n            peg$silentFails++;\n            s9 = peg$parseBlockTag();\n            peg$silentFails--;\n            if (s9 === peg$FAILED) {\n              s8 = undefined;\n            } else {\n              peg$currPos = s8;\n              s8 = peg$FAILED;\n            }\n            if (s8 !== peg$FAILED) {\n              s9 = peg$parsechar();\n              if (s9 !== peg$FAILED) {\n                s8 = [s8, s9];\n                s7 = s8;\n              } else {\n                peg$currPos = s7;\n                s7 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s7;\n              s7 = peg$FAILED;\n            }\n            while (s7 !== peg$FAILED) {\n              s6.push(s7);\n              s7 = peg$currPos;\n              s8 = peg$currPos;\n              peg$silentFails++;\n              s9 = peg$parseBlockTag();\n              peg$silentFails--;\n              if (s9 === peg$FAILED) {\n                s8 = undefined;\n              } else {\n                peg$currPos = s8;\n                s8 = peg$FAILED;\n              }\n              if (s8 !== peg$FAILED) {\n                s9 = peg$parsechar();\n                if (s9 !== peg$FAILED) {\n                  s8 = [s8, s9];\n                  s7 = s8;\n                } else {\n                  peg$currPos = s7;\n                  s7 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s7;\n                s7 = peg$FAILED;\n              }\n            }\n            s5 = input.substring(s5, peg$currPos);\n            s6 = peg$parseBlockTag();\n            if (s6 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f45(s2, s5);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          if (input.charCodeAt(peg$currPos) === 64) {\n            s1 = peg$c22;\n            peg$currPos++;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e26); }\n          }\n          if (s1 === peg$FAILED) {\n            s1 = null;\n          }\n          s2 = peg$parseMediaAlignmentTags();\n          if (s2 !== peg$FAILED) {\n            if (input.charCodeAt(peg$currPos) === 58) {\n              s3 = peg$c5;\n              peg$currPos++;\n            } else {\n              s3 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e8); }\n            }\n            if (s3 !== peg$FAILED) {\n              s4 = [];\n              if (input.charCodeAt(peg$currPos) === 32) {\n                s5 = peg$c12;\n                peg$currPos++;\n              } else {\n                s5 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e16); }\n              }\n              while (s5 !== peg$FAILED) {\n                s4.push(s5);\n                if (input.charCodeAt(peg$currPos) === 32) {\n                  s5 = peg$c12;\n                  peg$currPos++;\n                } else {\n                  s5 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                }\n              }\n              s5 = peg$parseMediaAlignment();\n              if (s5 !== peg$FAILED) {\n                s6 = [];\n                if (input.charCodeAt(peg$currPos) === 32) {\n                  s7 = peg$c12;\n                  peg$currPos++;\n                } else {\n                  s7 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                }\n                while (s7 !== peg$FAILED) {\n                  s6.push(s7);\n                  if (input.charCodeAt(peg$currPos) === 32) {\n                    s7 = peg$c12;\n                    peg$currPos++;\n                  } else {\n                    s7 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                  }\n                }\n                s7 = peg$parseBlockTag();\n                if (s7 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s0 = peg$f46(s2, s5);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            if (input.charCodeAt(peg$currPos) === 64) {\n              s1 = peg$c22;\n              peg$currPos++;\n            } else {\n              s1 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e26); }\n            }\n            if (s1 === peg$FAILED) {\n              s1 = null;\n            }\n            s2 = peg$parseMediaBooleanTags();\n            if (s2 !== peg$FAILED) {\n              if (input.charCodeAt(peg$currPos) === 58) {\n                s3 = peg$c5;\n                peg$currPos++;\n              } else {\n                s3 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e8); }\n              }\n              if (s3 !== peg$FAILED) {\n                s4 = [];\n                if (input.charCodeAt(peg$currPos) === 32) {\n                  s5 = peg$c12;\n                  peg$currPos++;\n                } else {\n                  s5 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                }\n                while (s5 !== peg$FAILED) {\n                  s4.push(s5);\n                  if (input.charCodeAt(peg$currPos) === 32) {\n                    s5 = peg$c12;\n                    peg$currPos++;\n                  } else {\n                    s5 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                  }\n                }\n                s5 = peg$parseBoolean();\n                if (s5 !== peg$FAILED) {\n                  s6 = [];\n                  if (input.charCodeAt(peg$currPos) === 32) {\n                    s7 = peg$c12;\n                    peg$currPos++;\n                  } else {\n                    s7 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                  }\n                  while (s7 !== peg$FAILED) {\n                    s6.push(s7);\n                    if (input.charCodeAt(peg$currPos) === 32) {\n                      s7 = peg$c12;\n                      peg$currPos++;\n                    } else {\n                      s7 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                    }\n                  }\n                  s7 = peg$parseBlockTag();\n                  if (s7 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f47(s2, s5);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n            if (s0 === peg$FAILED) {\n              s0 = peg$currPos;\n              if (input.charCodeAt(peg$currPos) === 64) {\n                s1 = peg$c22;\n                peg$currPos++;\n              } else {\n                s1 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e26); }\n              }\n              if (s1 === peg$FAILED) {\n                s1 = null;\n              }\n              s2 = peg$parseMediaBooleanTags();\n              if (s2 !== peg$FAILED) {\n                s3 = [];\n                if (input.charCodeAt(peg$currPos) === 32) {\n                  s4 = peg$c12;\n                  peg$currPos++;\n                } else {\n                  s4 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                }\n                while (s4 !== peg$FAILED) {\n                  s3.push(s4);\n                  if (input.charCodeAt(peg$currPos) === 32) {\n                    s4 = peg$c12;\n                    peg$currPos++;\n                  } else {\n                    s4 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                  }\n                }\n                s4 = peg$parseBlockTag();\n                if (s4 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s0 = peg$f48(s2);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n              if (s0 === peg$FAILED) {\n                s0 = peg$currPos;\n                if (input.charCodeAt(peg$currPos) === 64) {\n                  s1 = peg$c22;\n                  peg$currPos++;\n                } else {\n                  s1 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e26); }\n                }\n                if (s1 === peg$FAILED) {\n                  s1 = null;\n                }\n                s2 = peg$parseBlockTag();\n                if (s2 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s0 = peg$f49();\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n                if (s0 === peg$FAILED) {\n                  s0 = peg$currPos;\n                  if (input.charCodeAt(peg$currPos) === 64) {\n                    s1 = peg$c22;\n                    peg$currPos++;\n                  } else {\n                    s1 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e26); }\n                  }\n                  if (s1 === peg$FAILED) {\n                    s1 = null;\n                  }\n                  s2 = peg$currPos;\n                  s3 = [];\n                  s4 = peg$currPos;\n                  s5 = peg$currPos;\n                  peg$silentFails++;\n                  s6 = peg$parseBlockTag();\n                  peg$silentFails--;\n                  if (s6 === peg$FAILED) {\n                    s5 = undefined;\n                  } else {\n                    peg$currPos = s5;\n                    s5 = peg$FAILED;\n                  }\n                  if (s5 !== peg$FAILED) {\n                    s6 = peg$parsechar();\n                    if (s6 !== peg$FAILED) {\n                      s5 = [s5, s6];\n                      s4 = s5;\n                    } else {\n                      peg$currPos = s4;\n                      s4 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s4;\n                    s4 = peg$FAILED;\n                  }\n                  while (s4 !== peg$FAILED) {\n                    s3.push(s4);\n                    s4 = peg$currPos;\n                    s5 = peg$currPos;\n                    peg$silentFails++;\n                    s6 = peg$parseBlockTag();\n                    peg$silentFails--;\n                    if (s6 === peg$FAILED) {\n                      s5 = undefined;\n                    } else {\n                      peg$currPos = s5;\n                      s5 = peg$FAILED;\n                    }\n                    if (s5 !== peg$FAILED) {\n                      s6 = peg$parsechar();\n                      if (s6 !== peg$FAILED) {\n                        s5 = [s5, s6];\n                        s4 = s5;\n                      } else {\n                        peg$currPos = s4;\n                        s4 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s4;\n                      s4 = peg$FAILED;\n                    }\n                  }\n                  s2 = input.substring(s2, peg$currPos);\n                  s3 = peg$parseBlockTag();\n                  if (s3 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f50(s2);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseMediaSizeTags() {\n    let s0;\n\n    if (input.substr(peg$currPos, 5) === peg$c23) {\n      s0 = peg$c23;\n      peg$currPos += 5;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e27); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 6) === peg$c24) {\n        s0 = peg$c24;\n        peg$currPos += 6;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e28); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseMediaAlignmentTags() {\n    let s0;\n\n    if (input.substr(peg$currPos, 9) === peg$c25) {\n      s0 = peg$c25;\n      peg$currPos += 9;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e29); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 12) === peg$c26) {\n        s0 = peg$c26;\n        peg$currPos += 12;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e30); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseMediaAlignment() {\n    let s0;\n\n    if (input.substr(peg$currPos, 4) === peg$c27) {\n      s0 = peg$c27;\n      peg$currPos += 4;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e31); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 6) === peg$c28) {\n        s0 = peg$c28;\n        peg$currPos += 6;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e32); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 5) === peg$c29) {\n          s0 = peg$c29;\n          peg$currPos += 5;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e33); }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseMediaTextTags() {\n    let s0;\n\n    if (input.substr(peg$currPos, 3) === peg$c30) {\n      s0 = peg$c30;\n      peg$currPos += 3;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e34); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 7) === peg$c31) {\n        s0 = peg$c31;\n        peg$currPos += 7;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e35); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseMediaBooleanTags() {\n    let s0;\n\n    if (input.substr(peg$currPos, 12) === peg$c32) {\n      s0 = peg$c32;\n      peg$currPos += 12;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e36); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseBoolean() {\n    let s0;\n\n    if (input.substr(peg$currPos, 4) === peg$c33) {\n      s0 = peg$c33;\n      peg$currPos += 4;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e37); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 5) === peg$c34) {\n        s0 = peg$c34;\n        peg$currPos += 5;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e38); }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parsebitmarkPlus() {\n    let s0, s1;\n\n    peg$silentFails++;\n    s0 = peg$currPos;\n    s1 = peg$parseInlineTags();\n    peg$savedPos = s0;\n    s1 = peg$f51(s1);\n    s0 = s1;\n    peg$silentFails--;\n\n    return s0;\n  }\n\n  function peg$parsebitmarkPlusString() {\n    let s0;\n\n    peg$silentFails++;\n    s0 = peg$parseInlineTags();\n    peg$silentFails--;\n\n    return s0;\n  }\n\n  function peg$parseInlineTags() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parseInlinePlainText();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = [];\n    s3 = peg$parseInlineStyledText();\n    if (s3 === peg$FAILED) {\n      s3 = peg$parseInlinePlainText();\n    }\n    while (s3 !== peg$FAILED) {\n      s2.push(s3);\n      s3 = peg$parseInlineStyledText();\n      if (s3 === peg$FAILED) {\n        s3 = peg$parseInlinePlainText();\n      }\n    }\n    peg$savedPos = s0;\n    s0 = peg$f52(s1, s2);\n\n    return s0;\n  }\n\n  function peg$parseInlinePlainText() {\n    let s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseNL();\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f53();\n    }\n    s0 = s1;\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$currPos;\n      s2 = [];\n      s3 = peg$currPos;\n      s4 = peg$parseInlineTagTags();\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      s5 = peg$currPos;\n      peg$silentFails++;\n      s6 = peg$parseInlineStyledText();\n      peg$silentFails--;\n      if (s6 === peg$FAILED) {\n        s5 = undefined;\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parsechar();\n        if (s6 !== peg$FAILED) {\n          s4 = [s4, s5, s6];\n          s3 = s4;\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 === peg$FAILED) {\n        s3 = peg$currPos;\n        s4 = peg$parseInlineTagTags();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$parseInlineStyledText();\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s4 = [s4, s5];\n            s3 = s4;\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      }\n      if (s3 !== peg$FAILED) {\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = peg$currPos;\n          s4 = peg$parseInlineTagTags();\n          if (s4 === peg$FAILED) {\n            s4 = null;\n          }\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$parseInlineStyledText();\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parsechar();\n            if (s6 !== peg$FAILED) {\n              s4 = [s4, s5, s6];\n              s3 = s4;\n            } else {\n              peg$currPos = s3;\n              s3 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n          if (s3 === peg$FAILED) {\n            s3 = peg$currPos;\n            s4 = peg$parseInlineTagTags();\n            if (s4 !== peg$FAILED) {\n              s5 = peg$currPos;\n              peg$silentFails++;\n              s6 = peg$parseInlineStyledText();\n              peg$silentFails--;\n              if (s6 === peg$FAILED) {\n                s5 = undefined;\n              } else {\n                peg$currPos = s5;\n                s5 = peg$FAILED;\n              }\n              if (s5 !== peg$FAILED) {\n                s4 = [s4, s5];\n                s3 = s4;\n              } else {\n                peg$currPos = s3;\n                s3 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s3;\n              s3 = peg$FAILED;\n            }\n          }\n        }\n      } else {\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        s1 = input.substring(s1, peg$currPos);\n      } else {\n        s1 = s2;\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f54(s1);\n      }\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseInlineHalfTag() {\n    let s0;\n\n    if (input.charCodeAt(peg$currPos) === 61) {\n      s0 = peg$c35;\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e39); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseInlineTag() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseInlineHalfTag();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseInlineHalfTag();\n      if (s2 !== peg$FAILED) {\n        s1 = [s1, s2];\n        s0 = s1;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseInlineStyledText() {\n    let s0, s1, s2, s3, s4, s5, s6, s7;\n\n    s0 = peg$currPos;\n    s1 = peg$parseBodyBitOpenTag();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r1.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      if (s4 !== peg$FAILED) {\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = input.charAt(peg$currPos);\n          if (peg$r1.test(s4)) {\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e15); }\n          }\n        }\n      } else {\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = input.substring(s2, peg$currPos);\n      } else {\n        s2 = s3;\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseBodyBitCloseTag();\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f55(s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseInlineTag();\n      if (s1 !== peg$FAILED) {\n        s2 = peg$currPos;\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$parseInlineTag();\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          if (input.length > peg$currPos) {\n            s6 = input.charAt(peg$currPos);\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e0); }\n          }\n          if (s6 !== peg$FAILED) {\n            s5 = [s5, s6];\n            s4 = s5;\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$parseInlineTag();\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            if (input.length > peg$currPos) {\n              s6 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e0); }\n            }\n            if (s6 !== peg$FAILED) {\n              s5 = [s5, s6];\n              s4 = s5;\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        s2 = input.substring(s2, peg$currPos);\n        s3 = peg$parseInlineTag();\n        if (s3 !== peg$FAILED) {\n          if (input.substr(peg$currPos, 7) === peg$c36) {\n            s4 = peg$c36;\n            peg$currPos += 7;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e40); }\n          }\n          if (s4 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f56(s2);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parseInlineTag();\n        if (s1 !== peg$FAILED) {\n          s2 = peg$currPos;\n          s3 = [];\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$parseInlineTag();\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            if (input.length > peg$currPos) {\n              s6 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e0); }\n            }\n            if (s6 !== peg$FAILED) {\n              s5 = [s5, s6];\n              s4 = s5;\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n          while (s4 !== peg$FAILED) {\n            s3.push(s4);\n            s4 = peg$currPos;\n            s5 = peg$currPos;\n            peg$silentFails++;\n            s6 = peg$parseInlineTag();\n            peg$silentFails--;\n            if (s6 === peg$FAILED) {\n              s5 = undefined;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n            if (s5 !== peg$FAILED) {\n              if (input.length > peg$currPos) {\n                s6 = input.charAt(peg$currPos);\n                peg$currPos++;\n              } else {\n                s6 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e0); }\n              }\n              if (s6 !== peg$FAILED) {\n                s5 = [s5, s6];\n                s4 = s5;\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          }\n          s2 = input.substring(s2, peg$currPos);\n          s3 = peg$parseInlineTag();\n          if (s3 !== peg$FAILED) {\n            if (input.substr(peg$currPos, 13) === peg$c37) {\n              s4 = peg$c37;\n              peg$currPos += 13;\n            } else {\n              s4 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e41); }\n            }\n            if (s4 !== peg$FAILED) {\n              s5 = peg$parseUrl();\n              if (s5 !== peg$FAILED) {\n                if (input.charCodeAt(peg$currPos) === 124) {\n                  s6 = peg$c0;\n                  peg$currPos++;\n                } else {\n                  s6 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e2); }\n                }\n                if (s6 !== peg$FAILED) {\n                  s7 = peg$parseInlineMediaChain();\n                  peg$savedPos = s0;\n                  s0 = peg$f57(s2, s5, s7);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          s1 = peg$parseInlineTag();\n          if (s1 !== peg$FAILED) {\n            s2 = peg$currPos;\n            s3 = [];\n            s4 = peg$currPos;\n            s5 = peg$currPos;\n            peg$silentFails++;\n            s6 = peg$parseInlineTag();\n            peg$silentFails--;\n            if (s6 === peg$FAILED) {\n              s5 = undefined;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n            if (s5 !== peg$FAILED) {\n              if (input.length > peg$currPos) {\n                s6 = input.charAt(peg$currPos);\n                peg$currPos++;\n              } else {\n                s6 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e0); }\n              }\n              if (s6 !== peg$FAILED) {\n                s5 = [s5, s6];\n                s4 = s5;\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n            while (s4 !== peg$FAILED) {\n              s3.push(s4);\n              s4 = peg$currPos;\n              s5 = peg$currPos;\n              peg$silentFails++;\n              s6 = peg$parseInlineTag();\n              peg$silentFails--;\n              if (s6 === peg$FAILED) {\n                s5 = undefined;\n              } else {\n                peg$currPos = s5;\n                s5 = peg$FAILED;\n              }\n              if (s5 !== peg$FAILED) {\n                if (input.length > peg$currPos) {\n                  s6 = input.charAt(peg$currPos);\n                  peg$currPos++;\n                } else {\n                  s6 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                }\n                if (s6 !== peg$FAILED) {\n                  s5 = [s5, s6];\n                  s4 = s5;\n                } else {\n                  peg$currPos = s4;\n                  s4 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n            }\n            s2 = input.substring(s2, peg$currPos);\n            s3 = peg$parseInlineTag();\n            if (s3 !== peg$FAILED) {\n              s4 = peg$parseAttrChain();\n              if (s4 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f58(s2, s4);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            s1 = peg$parseBoldTag();\n            if (s1 !== peg$FAILED) {\n              s2 = peg$currPos;\n              s3 = [];\n              s4 = peg$currPos;\n              s5 = peg$currPos;\n              peg$silentFails++;\n              s6 = peg$parseBoldTag();\n              peg$silentFails--;\n              if (s6 === peg$FAILED) {\n                s5 = undefined;\n              } else {\n                peg$currPos = s5;\n                s5 = peg$FAILED;\n              }\n              if (s5 !== peg$FAILED) {\n                if (input.length > peg$currPos) {\n                  s6 = input.charAt(peg$currPos);\n                  peg$currPos++;\n                } else {\n                  s6 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                }\n                if (s6 !== peg$FAILED) {\n                  s5 = [s5, s6];\n                  s4 = s5;\n                } else {\n                  peg$currPos = s4;\n                  s4 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n              while (s4 !== peg$FAILED) {\n                s3.push(s4);\n                s4 = peg$currPos;\n                s5 = peg$currPos;\n                peg$silentFails++;\n                s6 = peg$parseBoldTag();\n                peg$silentFails--;\n                if (s6 === peg$FAILED) {\n                  s5 = undefined;\n                } else {\n                  peg$currPos = s5;\n                  s5 = peg$FAILED;\n                }\n                if (s5 !== peg$FAILED) {\n                  if (input.length > peg$currPos) {\n                    s6 = input.charAt(peg$currPos);\n                    peg$currPos++;\n                  } else {\n                    s6 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                  }\n                  if (s6 !== peg$FAILED) {\n                    s5 = [s5, s6];\n                    s4 = s5;\n                  } else {\n                    peg$currPos = s4;\n                    s4 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s4;\n                  s4 = peg$FAILED;\n                }\n              }\n              s2 = input.substring(s2, peg$currPos);\n              s3 = peg$parseBoldTag();\n              if (s3 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f59(s2);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n            if (s0 === peg$FAILED) {\n              s0 = peg$currPos;\n              s1 = peg$parseItalicTag();\n              if (s1 !== peg$FAILED) {\n                s2 = peg$currPos;\n                s3 = [];\n                s4 = peg$currPos;\n                s5 = peg$currPos;\n                peg$silentFails++;\n                s6 = peg$parseItalicTag();\n                peg$silentFails--;\n                if (s6 === peg$FAILED) {\n                  s5 = undefined;\n                } else {\n                  peg$currPos = s5;\n                  s5 = peg$FAILED;\n                }\n                if (s5 !== peg$FAILED) {\n                  if (input.length > peg$currPos) {\n                    s6 = input.charAt(peg$currPos);\n                    peg$currPos++;\n                  } else {\n                    s6 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                  }\n                  if (s6 !== peg$FAILED) {\n                    s5 = [s5, s6];\n                    s4 = s5;\n                  } else {\n                    peg$currPos = s4;\n                    s4 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s4;\n                  s4 = peg$FAILED;\n                }\n                while (s4 !== peg$FAILED) {\n                  s3.push(s4);\n                  s4 = peg$currPos;\n                  s5 = peg$currPos;\n                  peg$silentFails++;\n                  s6 = peg$parseItalicTag();\n                  peg$silentFails--;\n                  if (s6 === peg$FAILED) {\n                    s5 = undefined;\n                  } else {\n                    peg$currPos = s5;\n                    s5 = peg$FAILED;\n                  }\n                  if (s5 !== peg$FAILED) {\n                    if (input.length > peg$currPos) {\n                      s6 = input.charAt(peg$currPos);\n                      peg$currPos++;\n                    } else {\n                      s6 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                    }\n                    if (s6 !== peg$FAILED) {\n                      s5 = [s5, s6];\n                      s4 = s5;\n                    } else {\n                      peg$currPos = s4;\n                      s4 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s4;\n                    s4 = peg$FAILED;\n                  }\n                }\n                s2 = input.substring(s2, peg$currPos);\n                s3 = peg$parseItalicTag();\n                if (s3 !== peg$FAILED) {\n                  peg$savedPos = s0;\n                  s0 = peg$f60(s2);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n              if (s0 === peg$FAILED) {\n                s0 = peg$currPos;\n                s1 = peg$parseLightTag();\n                if (s1 !== peg$FAILED) {\n                  s2 = peg$currPos;\n                  s3 = [];\n                  s4 = peg$currPos;\n                  s5 = peg$currPos;\n                  peg$silentFails++;\n                  s6 = peg$parseLightTag();\n                  peg$silentFails--;\n                  if (s6 === peg$FAILED) {\n                    s5 = undefined;\n                  } else {\n                    peg$currPos = s5;\n                    s5 = peg$FAILED;\n                  }\n                  if (s5 !== peg$FAILED) {\n                    if (input.length > peg$currPos) {\n                      s6 = input.charAt(peg$currPos);\n                      peg$currPos++;\n                    } else {\n                      s6 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                    }\n                    if (s6 !== peg$FAILED) {\n                      s5 = [s5, s6];\n                      s4 = s5;\n                    } else {\n                      peg$currPos = s4;\n                      s4 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s4;\n                    s4 = peg$FAILED;\n                  }\n                  while (s4 !== peg$FAILED) {\n                    s3.push(s4);\n                    s4 = peg$currPos;\n                    s5 = peg$currPos;\n                    peg$silentFails++;\n                    s6 = peg$parseLightTag();\n                    peg$silentFails--;\n                    if (s6 === peg$FAILED) {\n                      s5 = undefined;\n                    } else {\n                      peg$currPos = s5;\n                      s5 = peg$FAILED;\n                    }\n                    if (s5 !== peg$FAILED) {\n                      if (input.length > peg$currPos) {\n                        s6 = input.charAt(peg$currPos);\n                        peg$currPos++;\n                      } else {\n                        s6 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                      }\n                      if (s6 !== peg$FAILED) {\n                        s5 = [s5, s6];\n                        s4 = s5;\n                      } else {\n                        peg$currPos = s4;\n                        s4 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s4;\n                      s4 = peg$FAILED;\n                    }\n                  }\n                  s2 = input.substring(s2, peg$currPos);\n                  s3 = peg$parseLightTag();\n                  if (s3 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f61(s2);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n                if (s0 === peg$FAILED) {\n                  s0 = peg$currPos;\n                  s1 = peg$parseHighlightTag();\n                  if (s1 !== peg$FAILED) {\n                    s2 = peg$currPos;\n                    s3 = [];\n                    s4 = peg$currPos;\n                    s5 = peg$currPos;\n                    peg$silentFails++;\n                    s6 = peg$parseHighlightTag();\n                    peg$silentFails--;\n                    if (s6 === peg$FAILED) {\n                      s5 = undefined;\n                    } else {\n                      peg$currPos = s5;\n                      s5 = peg$FAILED;\n                    }\n                    if (s5 !== peg$FAILED) {\n                      if (input.length > peg$currPos) {\n                        s6 = input.charAt(peg$currPos);\n                        peg$currPos++;\n                      } else {\n                        s6 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                      }\n                      if (s6 !== peg$FAILED) {\n                        s5 = [s5, s6];\n                        s4 = s5;\n                      } else {\n                        peg$currPos = s4;\n                        s4 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s4;\n                      s4 = peg$FAILED;\n                    }\n                    while (s4 !== peg$FAILED) {\n                      s3.push(s4);\n                      s4 = peg$currPos;\n                      s5 = peg$currPos;\n                      peg$silentFails++;\n                      s6 = peg$parseHighlightTag();\n                      peg$silentFails--;\n                      if (s6 === peg$FAILED) {\n                        s5 = undefined;\n                      } else {\n                        peg$currPos = s5;\n                        s5 = peg$FAILED;\n                      }\n                      if (s5 !== peg$FAILED) {\n                        if (input.length > peg$currPos) {\n                          s6 = input.charAt(peg$currPos);\n                          peg$currPos++;\n                        } else {\n                          s6 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                        }\n                        if (s6 !== peg$FAILED) {\n                          s5 = [s5, s6];\n                          s4 = s5;\n                        } else {\n                          peg$currPos = s4;\n                          s4 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s4;\n                        s4 = peg$FAILED;\n                      }\n                    }\n                    s2 = input.substring(s2, peg$currPos);\n                    s3 = peg$parseHighlightTag();\n                    if (s3 !== peg$FAILED) {\n                      peg$savedPos = s0;\n                      s0 = peg$f62(s2);\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                  if (s0 === peg$FAILED) {\n                    s0 = peg$currPos;\n                    s1 = peg$parseUrl();\n                    if (s1 !== peg$FAILED) {\n                      peg$savedPos = s0;\n                      s1 = peg$f63(s1);\n                    }\n                    s0 = s1;\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseInlineTagTags() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$parseInlineTag();\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = peg$parseInlineHalfTag();\n      if (s4 !== peg$FAILED) {\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$parseInlineHalfTag();\n        }\n      } else {\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = [s2, s3];\n        s1 = s2;\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$currPos;\n      s2 = peg$parseLightTag();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$parseLightHalfTag();\n        if (s4 !== peg$FAILED) {\n          while (s4 !== peg$FAILED) {\n            s3.push(s4);\n            s4 = peg$parseLightHalfTag();\n          }\n        } else {\n          s3 = peg$FAILED;\n        }\n        if (s3 !== peg$FAILED) {\n          s2 = [s2, s3];\n          s1 = s2;\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n      if (s1 !== peg$FAILED) {\n        s0 = input.substring(s0, peg$currPos);\n      } else {\n        s0 = s1;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$currPos;\n        s2 = peg$parseHighlightTag();\n        if (s2 !== peg$FAILED) {\n          s3 = [];\n          s4 = peg$parseHighlightHalfTag();\n          if (s4 !== peg$FAILED) {\n            while (s4 !== peg$FAILED) {\n              s3.push(s4);\n              s4 = peg$parseHighlightHalfTag();\n            }\n          } else {\n            s3 = peg$FAILED;\n          }\n          if (s3 !== peg$FAILED) {\n            s2 = [s2, s3];\n            s1 = s2;\n          } else {\n            peg$currPos = s1;\n            s1 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n        if (s1 !== peg$FAILED) {\n          s0 = input.substring(s0, peg$currPos);\n        } else {\n          s0 = s1;\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseAttrChain() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 124) {\n      s1 = peg$c0;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = peg$parseAttrChainItem();\n      if (s3 !== peg$FAILED) {\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = peg$parseAttrChainItem();\n        }\n      } else {\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f64(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseInlineMediaChain() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseInlineMediaChainItem();\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$parseInlineMediaChainItem();\n    }\n    peg$savedPos = s0;\n    s1 = peg$f65(s1);\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseInlineMediaChainItem() {\n    let s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 35) {\n      s1 = peg$c21;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e25); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = peg$currPos;\n      s5 = peg$currPos;\n      peg$silentFails++;\n      s6 = peg$parseBlockTag();\n      peg$silentFails--;\n      if (s6 === peg$FAILED) {\n        s5 = undefined;\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parsechar();\n        if (s6 !== peg$FAILED) {\n          s5 = [s5, s6];\n          s4 = s5;\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$parseBlockTag();\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parsechar();\n          if (s6 !== peg$FAILED) {\n            s5 = [s5, s6];\n            s4 = s5;\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      s3 = peg$parseBlockTag();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f66(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 64) {\n        s1 = peg$c22;\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e26); }\n      }\n      if (s1 === peg$FAILED) {\n        s1 = null;\n      }\n      if (input.substr(peg$currPos, 6) === peg$c38) {\n        s2 = peg$c38;\n        peg$currPos += 6;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e42); }\n      }\n      if (s2 !== peg$FAILED) {\n        if (input.charCodeAt(peg$currPos) === 58) {\n          s3 = peg$c5;\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e8); }\n        }\n        if (s3 !== peg$FAILED) {\n          s4 = [];\n          if (input.charCodeAt(peg$currPos) === 32) {\n            s5 = peg$c12;\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e16); }\n          }\n          while (s5 !== peg$FAILED) {\n            s4.push(s5);\n            if (input.charCodeAt(peg$currPos) === 32) {\n              s5 = peg$c12;\n              peg$currPos++;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e16); }\n            }\n          }\n          s5 = peg$currPos;\n          s6 = [];\n          s7 = peg$currPos;\n          s8 = peg$currPos;\n          peg$silentFails++;\n          s9 = peg$parseBlockTag();\n          peg$silentFails--;\n          if (s9 === peg$FAILED) {\n            s8 = undefined;\n          } else {\n            peg$currPos = s8;\n            s8 = peg$FAILED;\n          }\n          if (s8 !== peg$FAILED) {\n            s9 = peg$parsechar();\n            if (s9 !== peg$FAILED) {\n              s8 = [s8, s9];\n              s7 = s8;\n            } else {\n              peg$currPos = s7;\n              s7 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s7;\n            s7 = peg$FAILED;\n          }\n          while (s7 !== peg$FAILED) {\n            s6.push(s7);\n            s7 = peg$currPos;\n            s8 = peg$currPos;\n            peg$silentFails++;\n            s9 = peg$parseBlockTag();\n            peg$silentFails--;\n            if (s9 === peg$FAILED) {\n              s8 = undefined;\n            } else {\n              peg$currPos = s8;\n              s8 = peg$FAILED;\n            }\n            if (s8 !== peg$FAILED) {\n              s9 = peg$parsechar();\n              if (s9 !== peg$FAILED) {\n                s8 = [s8, s9];\n                s7 = s8;\n              } else {\n                peg$currPos = s7;\n                s7 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s7;\n              s7 = peg$FAILED;\n            }\n          }\n          s5 = input.substring(s5, peg$currPos);\n          s6 = peg$parseBlockTag();\n          if (s6 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f67(s2, s5);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        if (input.charCodeAt(peg$currPos) === 64) {\n          s1 = peg$c22;\n          peg$currPos++;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e26); }\n        }\n        if (s1 === peg$FAILED) {\n          s1 = null;\n        }\n        s2 = peg$parseMediaSizeTags();\n        if (s2 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 58) {\n            s3 = peg$c5;\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e8); }\n          }\n          if (s3 !== peg$FAILED) {\n            s4 = [];\n            if (input.charCodeAt(peg$currPos) === 32) {\n              s5 = peg$c12;\n              peg$currPos++;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e16); }\n            }\n            while (s5 !== peg$FAILED) {\n              s4.push(s5);\n              if (input.charCodeAt(peg$currPos) === 32) {\n                s5 = peg$c12;\n                peg$currPos++;\n              } else {\n                s5 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e16); }\n              }\n            }\n            s5 = peg$currPos;\n            s6 = [];\n            s7 = peg$currPos;\n            s8 = peg$currPos;\n            peg$silentFails++;\n            s9 = peg$parseBlockTag();\n            peg$silentFails--;\n            if (s9 === peg$FAILED) {\n              s8 = undefined;\n            } else {\n              peg$currPos = s8;\n              s8 = peg$FAILED;\n            }\n            if (s8 !== peg$FAILED) {\n              s9 = input.charAt(peg$currPos);\n              if (peg$r1.test(s9)) {\n                peg$currPos++;\n              } else {\n                s9 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e15); }\n              }\n              if (s9 !== peg$FAILED) {\n                s8 = [s8, s9];\n                s7 = s8;\n              } else {\n                peg$currPos = s7;\n                s7 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s7;\n              s7 = peg$FAILED;\n            }\n            if (s7 !== peg$FAILED) {\n              while (s7 !== peg$FAILED) {\n                s6.push(s7);\n                s7 = peg$currPos;\n                s8 = peg$currPos;\n                peg$silentFails++;\n                s9 = peg$parseBlockTag();\n                peg$silentFails--;\n                if (s9 === peg$FAILED) {\n                  s8 = undefined;\n                } else {\n                  peg$currPos = s8;\n                  s8 = peg$FAILED;\n                }\n                if (s8 !== peg$FAILED) {\n                  s9 = input.charAt(peg$currPos);\n                  if (peg$r1.test(s9)) {\n                    peg$currPos++;\n                  } else {\n                    s9 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e15); }\n                  }\n                  if (s9 !== peg$FAILED) {\n                    s8 = [s8, s9];\n                    s7 = s8;\n                  } else {\n                    peg$currPos = s7;\n                    s7 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s7;\n                  s7 = peg$FAILED;\n                }\n              }\n            } else {\n              s6 = peg$FAILED;\n            }\n            if (s6 !== peg$FAILED) {\n              s5 = input.substring(s5, peg$currPos);\n            } else {\n              s5 = s6;\n            }\n            if (s5 !== peg$FAILED) {\n              s6 = peg$parseBlockTag();\n              if (s6 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f68(s2, s5);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          if (input.charCodeAt(peg$currPos) === 64) {\n            s1 = peg$c22;\n            peg$currPos++;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e26); }\n          }\n          if (s1 === peg$FAILED) {\n            s1 = null;\n          }\n          s2 = peg$parseMediaSizeTags();\n          if (s2 !== peg$FAILED) {\n            if (input.charCodeAt(peg$currPos) === 58) {\n              s3 = peg$c5;\n              peg$currPos++;\n            } else {\n              s3 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e8); }\n            }\n            if (s3 !== peg$FAILED) {\n              s4 = [];\n              if (input.charCodeAt(peg$currPos) === 32) {\n                s5 = peg$c12;\n                peg$currPos++;\n              } else {\n                s5 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e16); }\n              }\n              while (s5 !== peg$FAILED) {\n                s4.push(s5);\n                if (input.charCodeAt(peg$currPos) === 32) {\n                  s5 = peg$c12;\n                  peg$currPos++;\n                } else {\n                  s5 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                }\n              }\n              s5 = peg$currPos;\n              s6 = [];\n              s7 = peg$currPos;\n              s8 = peg$currPos;\n              peg$silentFails++;\n              s9 = peg$parseBlockTag();\n              peg$silentFails--;\n              if (s9 === peg$FAILED) {\n                s8 = undefined;\n              } else {\n                peg$currPos = s8;\n                s8 = peg$FAILED;\n              }\n              if (s8 !== peg$FAILED) {\n                s9 = peg$parsechar();\n                if (s9 !== peg$FAILED) {\n                  s8 = [s8, s9];\n                  s7 = s8;\n                } else {\n                  peg$currPos = s7;\n                  s7 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s7;\n                s7 = peg$FAILED;\n              }\n              while (s7 !== peg$FAILED) {\n                s6.push(s7);\n                s7 = peg$currPos;\n                s8 = peg$currPos;\n                peg$silentFails++;\n                s9 = peg$parseBlockTag();\n                peg$silentFails--;\n                if (s9 === peg$FAILED) {\n                  s8 = undefined;\n                } else {\n                  peg$currPos = s8;\n                  s8 = peg$FAILED;\n                }\n                if (s8 !== peg$FAILED) {\n                  s9 = peg$parsechar();\n                  if (s9 !== peg$FAILED) {\n                    s8 = [s8, s9];\n                    s7 = s8;\n                  } else {\n                    peg$currPos = s7;\n                    s7 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s7;\n                  s7 = peg$FAILED;\n                }\n              }\n              s5 = input.substring(s5, peg$currPos);\n              s6 = peg$parseBlockTag();\n              if (s6 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f69(s2, s5);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            if (input.charCodeAt(peg$currPos) === 64) {\n              s1 = peg$c22;\n              peg$currPos++;\n            } else {\n              s1 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e26); }\n            }\n            if (s1 === peg$FAILED) {\n              s1 = null;\n            }\n            if (input.substr(peg$currPos, 17) === peg$c39) {\n              s2 = peg$c39;\n              peg$currPos += 17;\n            } else {\n              s2 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e43); }\n            }\n            if (s2 !== peg$FAILED) {\n              if (input.charCodeAt(peg$currPos) === 58) {\n                s3 = peg$c5;\n                peg$currPos++;\n              } else {\n                s3 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e8); }\n              }\n              if (s3 !== peg$FAILED) {\n                s4 = [];\n                if (input.charCodeAt(peg$currPos) === 32) {\n                  s5 = peg$c12;\n                  peg$currPos++;\n                } else {\n                  s5 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                }\n                while (s5 !== peg$FAILED) {\n                  s4.push(s5);\n                  if (input.charCodeAt(peg$currPos) === 32) {\n                    s5 = peg$c12;\n                    peg$currPos++;\n                  } else {\n                    s5 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                  }\n                }\n                s5 = peg$parseInlineMediaAlignment();\n                if (s5 !== peg$FAILED) {\n                  s6 = peg$parseBlockTag();\n                  if (s6 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f70(s2, s5);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n            if (s0 === peg$FAILED) {\n              s0 = peg$currPos;\n              if (input.charCodeAt(peg$currPos) === 64) {\n                s1 = peg$c22;\n                peg$currPos++;\n              } else {\n                s1 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e26); }\n              }\n              if (s1 === peg$FAILED) {\n                s1 = null;\n              }\n              if (input.substr(peg$currPos, 4) === peg$c40) {\n                s2 = peg$c40;\n                peg$currPos += 4;\n              } else {\n                s2 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e44); }\n              }\n              if (s2 !== peg$FAILED) {\n                if (input.charCodeAt(peg$currPos) === 58) {\n                  s3 = peg$c5;\n                  peg$currPos++;\n                } else {\n                  s3 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e8); }\n                }\n                if (s3 !== peg$FAILED) {\n                  s4 = [];\n                  if (input.charCodeAt(peg$currPos) === 32) {\n                    s5 = peg$c12;\n                    peg$currPos++;\n                  } else {\n                    s5 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                  }\n                  while (s5 !== peg$FAILED) {\n                    s4.push(s5);\n                    if (input.charCodeAt(peg$currPos) === 32) {\n                      s5 = peg$c12;\n                      peg$currPos++;\n                    } else {\n                      s5 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e16); }\n                    }\n                  }\n                  s5 = peg$parseInlineMediaSize();\n                  if (s5 !== peg$FAILED) {\n                    s6 = peg$parseBlockTag();\n                    if (s6 !== peg$FAILED) {\n                      peg$savedPos = s0;\n                      s0 = peg$f71(s2, s5);\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseInlineMediaAlignment() {\n    let s0;\n\n    if (input.substr(peg$currPos, 3) === peg$c41) {\n      s0 = peg$c41;\n      peg$currPos += 3;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e45); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 6) === peg$c42) {\n        s0 = peg$c42;\n        peg$currPos += 6;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e46); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 6) === peg$c43) {\n          s0 = peg$c43;\n          peg$currPos += 6;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e47); }\n        }\n        if (s0 === peg$FAILED) {\n          if (input.substr(peg$currPos, 8) === peg$c44) {\n            s0 = peg$c44;\n            peg$currPos += 8;\n          } else {\n            s0 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e48); }\n          }\n          if (s0 === peg$FAILED) {\n            if (input.substr(peg$currPos, 3) === peg$c45) {\n              s0 = peg$c45;\n              peg$currPos += 3;\n            } else {\n              s0 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e49); }\n            }\n            if (s0 === peg$FAILED) {\n              if (input.substr(peg$currPos, 5) === peg$c46) {\n                s0 = peg$c46;\n                peg$currPos += 5;\n              } else {\n                s0 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e50); }\n              }\n              if (s0 === peg$FAILED) {\n                if (input.substr(peg$currPos, 11) === peg$c47) {\n                  s0 = peg$c47;\n                  peg$currPos += 11;\n                } else {\n                  s0 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e51); }\n                }\n                if (s0 === peg$FAILED) {\n                  if (input.substr(peg$currPos, 8) === peg$c48) {\n                    s0 = peg$c48;\n                    peg$currPos += 8;\n                  } else {\n                    s0 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e52); }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseInlineMediaSize() {\n    let s0;\n\n    if (input.substr(peg$currPos, 11) === peg$c49) {\n      s0 = peg$c49;\n      peg$currPos += 11;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e53); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 11) === peg$c50) {\n        s0 = peg$c50;\n        peg$currPos += 11;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e54); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 5) === peg$c46) {\n          s0 = peg$c46;\n          peg$currPos += 5;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e50); }\n        }\n        if (s0 === peg$FAILED) {\n          if (input.substr(peg$currPos, 3) === peg$c45) {\n            s0 = peg$c45;\n            peg$currPos += 3;\n          } else {\n            s0 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e49); }\n          }\n          if (s0 === peg$FAILED) {\n            if (input.substr(peg$currPos, 8) === peg$c51) {\n              s0 = peg$c51;\n              peg$currPos += 8;\n            } else {\n              s0 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e55); }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseAttrChainItem() {\n    let s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 5) === peg$c52) {\n      s1 = peg$c52;\n      peg$currPos += 5;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e56); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = peg$currPos;\n      s5 = peg$currPos;\n      peg$silentFails++;\n      s6 = peg$parseBlockTag();\n      peg$silentFails--;\n      if (s6 === peg$FAILED) {\n        s5 = undefined;\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parsechar();\n        if (s6 !== peg$FAILED) {\n          s5 = [s5, s6];\n          s4 = s5;\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$parseBlockTag();\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parsechar();\n          if (s6 !== peg$FAILED) {\n            s5 = [s5, s6];\n            s4 = s5;\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      s3 = peg$parseBlockTag();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f72(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 7) === peg$c53) {\n        s1 = peg$c53;\n        peg$currPos += 7;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e57); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$currPos;\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$parseBlockTag();\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parsechar();\n          if (s6 !== peg$FAILED) {\n            s5 = [s5, s6];\n            s4 = s5;\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$parseBlockTag();\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parsechar();\n            if (s6 !== peg$FAILED) {\n              s5 = [s5, s6];\n              s4 = s5;\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        s2 = input.substring(s2, peg$currPos);\n        s3 = peg$parseRefsChain();\n        s4 = peg$parseBlockTag();\n        if (s4 !== peg$FAILED) {\n          if (input.substr(peg$currPos, 9) === peg$c54) {\n            s5 = peg$c54;\n            peg$currPos += 9;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e58); }\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$currPos;\n            s7 = [];\n            s8 = peg$currPos;\n            s9 = peg$currPos;\n            peg$silentFails++;\n            s10 = peg$parseBlockTag();\n            peg$silentFails--;\n            if (s10 === peg$FAILED) {\n              s9 = undefined;\n            } else {\n              peg$currPos = s9;\n              s9 = peg$FAILED;\n            }\n            if (s9 !== peg$FAILED) {\n              s10 = peg$parsechar();\n              if (s10 !== peg$FAILED) {\n                s9 = [s9, s10];\n                s8 = s9;\n              } else {\n                peg$currPos = s8;\n                s8 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s8;\n              s8 = peg$FAILED;\n            }\n            while (s8 !== peg$FAILED) {\n              s7.push(s8);\n              s8 = peg$currPos;\n              s9 = peg$currPos;\n              peg$silentFails++;\n              s10 = peg$parseBlockTag();\n              peg$silentFails--;\n              if (s10 === peg$FAILED) {\n                s9 = undefined;\n              } else {\n                peg$currPos = s9;\n                s9 = peg$FAILED;\n              }\n              if (s9 !== peg$FAILED) {\n                s10 = peg$parsechar();\n                if (s10 !== peg$FAILED) {\n                  s9 = [s9, s10];\n                  s8 = s9;\n                } else {\n                  peg$currPos = s8;\n                  s8 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s8;\n                s8 = peg$FAILED;\n              }\n            }\n            s6 = input.substring(s6, peg$currPos);\n            s7 = peg$parseBlockTag();\n            if (s7 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f73(s2, s3, s6);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        if (input.substr(peg$currPos, 5) === peg$c55) {\n          s1 = peg$c55;\n          peg$currPos += 5;\n        } else {\n          s1 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e59); }\n        }\n        if (s1 !== peg$FAILED) {\n          s2 = peg$currPos;\n          s3 = [];\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$parseBlockTag();\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parsechar();\n            if (s6 !== peg$FAILED) {\n              s5 = [s5, s6];\n              s4 = s5;\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n          while (s4 !== peg$FAILED) {\n            s3.push(s4);\n            s4 = peg$currPos;\n            s5 = peg$currPos;\n            peg$silentFails++;\n            s6 = peg$parseBlockTag();\n            peg$silentFails--;\n            if (s6 === peg$FAILED) {\n              s5 = undefined;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n            if (s5 !== peg$FAILED) {\n              s6 = peg$parsechar();\n              if (s6 !== peg$FAILED) {\n                s5 = [s5, s6];\n                s4 = s5;\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          }\n          s2 = input.substring(s2, peg$currPos);\n          s3 = peg$parseBlockTag();\n          if (s3 !== peg$FAILED) {\n            if (input.charCodeAt(peg$currPos) === 9658) {\n              s4 = peg$c56;\n              peg$currPos++;\n            } else {\n              s4 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e60); }\n            }\n            if (s4 !== peg$FAILED) {\n              s5 = peg$currPos;\n              s6 = [];\n              s7 = peg$currPos;\n              s8 = peg$currPos;\n              peg$silentFails++;\n              s9 = peg$parseBlockTag();\n              peg$silentFails--;\n              if (s9 === peg$FAILED) {\n                s8 = undefined;\n              } else {\n                peg$currPos = s8;\n                s8 = peg$FAILED;\n              }\n              if (s8 !== peg$FAILED) {\n                s9 = peg$parsechar();\n                if (s9 !== peg$FAILED) {\n                  s8 = [s8, s9];\n                  s7 = s8;\n                } else {\n                  peg$currPos = s7;\n                  s7 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s7;\n                s7 = peg$FAILED;\n              }\n              while (s7 !== peg$FAILED) {\n                s6.push(s7);\n                s7 = peg$currPos;\n                s8 = peg$currPos;\n                peg$silentFails++;\n                s9 = peg$parseBlockTag();\n                peg$silentFails--;\n                if (s9 === peg$FAILED) {\n                  s8 = undefined;\n                } else {\n                  peg$currPos = s8;\n                  s8 = peg$FAILED;\n                }\n                if (s8 !== peg$FAILED) {\n                  s9 = peg$parsechar();\n                  if (s9 !== peg$FAILED) {\n                    s8 = [s8, s9];\n                    s7 = s8;\n                  } else {\n                    peg$currPos = s7;\n                    s7 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s7;\n                  s7 = peg$FAILED;\n                }\n              }\n              s5 = input.substring(s5, peg$currPos);\n              s6 = peg$parseBlockTag();\n              if (s6 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f74(s2, s5);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          if (input.substr(peg$currPos, 5) === peg$c55) {\n            s1 = peg$c55;\n            peg$currPos += 5;\n          } else {\n            s1 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e59); }\n          }\n          if (s1 !== peg$FAILED) {\n            s2 = peg$currPos;\n            s3 = [];\n            s4 = peg$currPos;\n            s5 = peg$currPos;\n            peg$silentFails++;\n            s6 = peg$parseBlockTag();\n            peg$silentFails--;\n            if (s6 === peg$FAILED) {\n              s5 = undefined;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n            if (s5 !== peg$FAILED) {\n              s6 = peg$parsechar();\n              if (s6 !== peg$FAILED) {\n                s5 = [s5, s6];\n                s4 = s5;\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n            while (s4 !== peg$FAILED) {\n              s3.push(s4);\n              s4 = peg$currPos;\n              s5 = peg$currPos;\n              peg$silentFails++;\n              s6 = peg$parseBlockTag();\n              peg$silentFails--;\n              if (s6 === peg$FAILED) {\n                s5 = undefined;\n              } else {\n                peg$currPos = s5;\n                s5 = peg$FAILED;\n              }\n              if (s5 !== peg$FAILED) {\n                s6 = peg$parsechar();\n                if (s6 !== peg$FAILED) {\n                  s5 = [s5, s6];\n                  s4 = s5;\n                } else {\n                  peg$currPos = s4;\n                  s4 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n            }\n            s2 = input.substring(s2, peg$currPos);\n            s3 = peg$parseBlockTag();\n            if (s3 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f75(s2);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            if (input.charCodeAt(peg$currPos) === 9658) {\n              s1 = peg$c56;\n              peg$currPos++;\n            } else {\n              s1 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e60); }\n            }\n            if (s1 !== peg$FAILED) {\n              s2 = peg$currPos;\n              s3 = [];\n              s4 = peg$currPos;\n              s5 = peg$currPos;\n              peg$silentFails++;\n              s6 = peg$parseBlockTag();\n              peg$silentFails--;\n              if (s6 === peg$FAILED) {\n                s5 = undefined;\n              } else {\n                peg$currPos = s5;\n                s5 = peg$FAILED;\n              }\n              if (s5 !== peg$FAILED) {\n                s6 = peg$parsechar();\n                if (s6 !== peg$FAILED) {\n                  s5 = [s5, s6];\n                  s4 = s5;\n                } else {\n                  peg$currPos = s4;\n                  s4 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n              while (s4 !== peg$FAILED) {\n                s3.push(s4);\n                s4 = peg$currPos;\n                s5 = peg$currPos;\n                peg$silentFails++;\n                s6 = peg$parseBlockTag();\n                peg$silentFails--;\n                if (s6 === peg$FAILED) {\n                  s5 = undefined;\n                } else {\n                  peg$currPos = s5;\n                  s5 = peg$FAILED;\n                }\n                if (s5 !== peg$FAILED) {\n                  s6 = peg$parsechar();\n                  if (s6 !== peg$FAILED) {\n                    s5 = [s5, s6];\n                    s4 = s5;\n                  } else {\n                    peg$currPos = s4;\n                    s4 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s4;\n                  s4 = peg$FAILED;\n                }\n              }\n              s2 = input.substring(s2, peg$currPos);\n              s3 = peg$parseBlockTag();\n              if (s3 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f76(s2);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n            if (s0 === peg$FAILED) {\n              s0 = peg$currPos;\n              if (input.substr(peg$currPos, 7) === peg$c57) {\n                s1 = peg$c57;\n                peg$currPos += 7;\n              } else {\n                s1 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e61); }\n              }\n              if (s1 !== peg$FAILED) {\n                s2 = peg$currPos;\n                s3 = [];\n                s4 = peg$currPos;\n                s5 = peg$currPos;\n                peg$silentFails++;\n                s6 = peg$parseBlockTag();\n                peg$silentFails--;\n                if (s6 === peg$FAILED) {\n                  s5 = undefined;\n                } else {\n                  peg$currPos = s5;\n                  s5 = peg$FAILED;\n                }\n                if (s5 !== peg$FAILED) {\n                  s6 = peg$parsechar();\n                  if (s6 !== peg$FAILED) {\n                    s5 = [s5, s6];\n                    s4 = s5;\n                  } else {\n                    peg$currPos = s4;\n                    s4 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s4;\n                  s4 = peg$FAILED;\n                }\n                while (s4 !== peg$FAILED) {\n                  s3.push(s4);\n                  s4 = peg$currPos;\n                  s5 = peg$currPos;\n                  peg$silentFails++;\n                  s6 = peg$parseBlockTag();\n                  peg$silentFails--;\n                  if (s6 === peg$FAILED) {\n                    s5 = undefined;\n                  } else {\n                    peg$currPos = s5;\n                    s5 = peg$FAILED;\n                  }\n                  if (s5 !== peg$FAILED) {\n                    s6 = peg$parsechar();\n                    if (s6 !== peg$FAILED) {\n                      s5 = [s5, s6];\n                      s4 = s5;\n                    } else {\n                      peg$currPos = s4;\n                      s4 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s4;\n                    s4 = peg$FAILED;\n                  }\n                }\n                s2 = input.substring(s2, peg$currPos);\n                s3 = peg$parseBlockTag();\n                if (s3 !== peg$FAILED) {\n                  s4 = peg$parseMediaChain();\n                  peg$savedPos = s0;\n                  s0 = peg$f77(s2, s4);\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n              if (s0 === peg$FAILED) {\n                s0 = peg$currPos;\n                if (input.substr(peg$currPos, 9) === peg$c58) {\n                  s1 = peg$c58;\n                  peg$currPos += 9;\n                } else {\n                  s1 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e62); }\n                }\n                if (s1 !== peg$FAILED) {\n                  s2 = peg$currPos;\n                  s3 = [];\n                  s4 = peg$currPos;\n                  s5 = peg$currPos;\n                  peg$silentFails++;\n                  s6 = peg$parseBlockTag();\n                  peg$silentFails--;\n                  if (s6 === peg$FAILED) {\n                    s5 = undefined;\n                  } else {\n                    peg$currPos = s5;\n                    s5 = peg$FAILED;\n                  }\n                  if (s5 !== peg$FAILED) {\n                    s6 = peg$parsechar();\n                    if (s6 !== peg$FAILED) {\n                      s5 = [s5, s6];\n                      s4 = s5;\n                    } else {\n                      peg$currPos = s4;\n                      s4 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s4;\n                    s4 = peg$FAILED;\n                  }\n                  while (s4 !== peg$FAILED) {\n                    s3.push(s4);\n                    s4 = peg$currPos;\n                    s5 = peg$currPos;\n                    peg$silentFails++;\n                    s6 = peg$parseBlockTag();\n                    peg$silentFails--;\n                    if (s6 === peg$FAILED) {\n                      s5 = undefined;\n                    } else {\n                      peg$currPos = s5;\n                      s5 = peg$FAILED;\n                    }\n                    if (s5 !== peg$FAILED) {\n                      s6 = peg$parsechar();\n                      if (s6 !== peg$FAILED) {\n                        s5 = [s5, s6];\n                        s4 = s5;\n                      } else {\n                        peg$currPos = s4;\n                        s4 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s4;\n                      s4 = peg$FAILED;\n                    }\n                  }\n                  s2 = input.substring(s2, peg$currPos);\n                  s3 = peg$parseBlockTag();\n                  if (s3 !== peg$FAILED) {\n                    peg$savedPos = s0;\n                    s0 = peg$f78(s2);\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s0;\n                  s0 = peg$FAILED;\n                }\n                if (s0 === peg$FAILED) {\n                  s0 = peg$currPos;\n                  if (input.substr(peg$currPos, 10) === peg$c59) {\n                    s1 = peg$c59;\n                    peg$currPos += 10;\n                  } else {\n                    s1 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e63); }\n                  }\n                  if (s1 !== peg$FAILED) {\n                    s2 = peg$currPos;\n                    s3 = [];\n                    s4 = peg$currPos;\n                    s5 = peg$currPos;\n                    peg$silentFails++;\n                    s6 = peg$parseBlockTag();\n                    peg$silentFails--;\n                    if (s6 === peg$FAILED) {\n                      s5 = undefined;\n                    } else {\n                      peg$currPos = s5;\n                      s5 = peg$FAILED;\n                    }\n                    if (s5 !== peg$FAILED) {\n                      s6 = peg$parsechar();\n                      if (s6 !== peg$FAILED) {\n                        s5 = [s5, s6];\n                        s4 = s5;\n                      } else {\n                        peg$currPos = s4;\n                        s4 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s4;\n                      s4 = peg$FAILED;\n                    }\n                    while (s4 !== peg$FAILED) {\n                      s3.push(s4);\n                      s4 = peg$currPos;\n                      s5 = peg$currPos;\n                      peg$silentFails++;\n                      s6 = peg$parseBlockTag();\n                      peg$silentFails--;\n                      if (s6 === peg$FAILED) {\n                        s5 = undefined;\n                      } else {\n                        peg$currPos = s5;\n                        s5 = peg$FAILED;\n                      }\n                      if (s5 !== peg$FAILED) {\n                        s6 = peg$parsechar();\n                        if (s6 !== peg$FAILED) {\n                          s5 = [s5, s6];\n                          s4 = s5;\n                        } else {\n                          peg$currPos = s4;\n                          s4 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s4;\n                        s4 = peg$FAILED;\n                      }\n                    }\n                    s2 = input.substring(s2, peg$currPos);\n                    s3 = peg$parseBlockTag();\n                    if (s3 !== peg$FAILED) {\n                      peg$savedPos = s0;\n                      s0 = peg$f79(s2);\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                  } else {\n                    peg$currPos = s0;\n                    s0 = peg$FAILED;\n                  }\n                  if (s0 === peg$FAILED) {\n                    s0 = peg$currPos;\n                    if (input.substr(peg$currPos, 4) === peg$c60) {\n                      s1 = peg$c60;\n                      peg$currPos += 4;\n                    } else {\n                      s1 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e64); }\n                    }\n                    if (s1 !== peg$FAILED) {\n                      s2 = peg$currPos;\n                      s3 = [];\n                      s4 = peg$currPos;\n                      s5 = peg$currPos;\n                      peg$silentFails++;\n                      s6 = peg$parseBlockTag();\n                      peg$silentFails--;\n                      if (s6 === peg$FAILED) {\n                        s5 = undefined;\n                      } else {\n                        peg$currPos = s5;\n                        s5 = peg$FAILED;\n                      }\n                      if (s5 !== peg$FAILED) {\n                        s6 = peg$parsechar();\n                        if (s6 !== peg$FAILED) {\n                          s5 = [s5, s6];\n                          s4 = s5;\n                        } else {\n                          peg$currPos = s4;\n                          s4 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s4;\n                        s4 = peg$FAILED;\n                      }\n                      while (s4 !== peg$FAILED) {\n                        s3.push(s4);\n                        s4 = peg$currPos;\n                        s5 = peg$currPos;\n                        peg$silentFails++;\n                        s6 = peg$parseBlockTag();\n                        peg$silentFails--;\n                        if (s6 === peg$FAILED) {\n                          s5 = undefined;\n                        } else {\n                          peg$currPos = s5;\n                          s5 = peg$FAILED;\n                        }\n                        if (s5 !== peg$FAILED) {\n                          s6 = peg$parsechar();\n                          if (s6 !== peg$FAILED) {\n                            s5 = [s5, s6];\n                            s4 = s5;\n                          } else {\n                            peg$currPos = s4;\n                            s4 = peg$FAILED;\n                          }\n                        } else {\n                          peg$currPos = s4;\n                          s4 = peg$FAILED;\n                        }\n                      }\n                      s2 = input.substring(s2, peg$currPos);\n                      s3 = peg$parseBlockTag();\n                      if (s3 !== peg$FAILED) {\n                        peg$savedPos = s0;\n                        s0 = peg$f80(s2);\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                    } else {\n                      peg$currPos = s0;\n                      s0 = peg$FAILED;\n                    }\n                    if (s0 === peg$FAILED) {\n                      s0 = peg$currPos;\n                      if (input.substr(peg$currPos, 4) === peg$c4) {\n                        s1 = peg$c4;\n                        peg$currPos += 4;\n                      } else {\n                        s1 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e6); }\n                      }\n                      if (s1 !== peg$FAILED) {\n                        s2 = peg$parseBlockTag();\n                        if (s2 !== peg$FAILED) {\n                          peg$savedPos = s0;\n                          s0 = peg$f81();\n                        } else {\n                          peg$currPos = s0;\n                          s0 = peg$FAILED;\n                        }\n                      } else {\n                        peg$currPos = s0;\n                        s0 = peg$FAILED;\n                      }\n                      if (s0 === peg$FAILED) {\n                        s0 = peg$currPos;\n                        if (input.substr(peg$currPos, 5) === peg$c61) {\n                          s1 = peg$c61;\n                          peg$currPos += 5;\n                        } else {\n                          s1 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e65); }\n                        }\n                        if (s1 !== peg$FAILED) {\n                          s2 = peg$currPos;\n                          s3 = [];\n                          s4 = peg$currPos;\n                          s5 = peg$currPos;\n                          peg$silentFails++;\n                          s6 = peg$parseBlockTag();\n                          peg$silentFails--;\n                          if (s6 === peg$FAILED) {\n                            s5 = undefined;\n                          } else {\n                            peg$currPos = s5;\n                            s5 = peg$FAILED;\n                          }\n                          if (s5 !== peg$FAILED) {\n                            s6 = peg$parsechar();\n                            if (s6 !== peg$FAILED) {\n                              s5 = [s5, s6];\n                              s4 = s5;\n                            } else {\n                              peg$currPos = s4;\n                              s4 = peg$FAILED;\n                            }\n                          } else {\n                            peg$currPos = s4;\n                            s4 = peg$FAILED;\n                          }\n                          while (s4 !== peg$FAILED) {\n                            s3.push(s4);\n                            s4 = peg$currPos;\n                            s5 = peg$currPos;\n                            peg$silentFails++;\n                            s6 = peg$parseBlockTag();\n                            peg$silentFails--;\n                            if (s6 === peg$FAILED) {\n                              s5 = undefined;\n                            } else {\n                              peg$currPos = s5;\n                              s5 = peg$FAILED;\n                            }\n                            if (s5 !== peg$FAILED) {\n                              s6 = peg$parsechar();\n                              if (s6 !== peg$FAILED) {\n                                s5 = [s5, s6];\n                                s4 = s5;\n                              } else {\n                                peg$currPos = s4;\n                                s4 = peg$FAILED;\n                              }\n                            } else {\n                              peg$currPos = s4;\n                              s4 = peg$FAILED;\n                            }\n                          }\n                          s2 = input.substring(s2, peg$currPos);\n                          s3 = peg$parseBlockTag();\n                          if (s3 !== peg$FAILED) {\n                            peg$savedPos = s0;\n                            s0 = peg$f82(s2);\n                          } else {\n                            peg$currPos = s0;\n                            s0 = peg$FAILED;\n                          }\n                        } else {\n                          peg$currPos = s0;\n                          s0 = peg$FAILED;\n                        }\n                        if (s0 === peg$FAILED) {\n                          s0 = peg$currPos;\n                          if (input.substr(peg$currPos, 5) === peg$c62) {\n                            s1 = peg$c62;\n                            peg$currPos += 5;\n                          } else {\n                            s1 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$e66); }\n                          }\n                          if (s1 !== peg$FAILED) {\n                            s2 = peg$parseBlockTag();\n                            if (s2 !== peg$FAILED) {\n                              if (input.substr(peg$currPos, 9) === peg$c63) {\n                                s3 = peg$c63;\n                                peg$currPos += 9;\n                              } else {\n                                s3 = peg$FAILED;\n                                if (peg$silentFails === 0) { peg$fail(peg$e67); }\n                              }\n                              if (s3 !== peg$FAILED) {\n                                s4 = peg$currPos;\n                                s5 = peg$currPos;\n                                if (input.charCodeAt(peg$currPos) === 80) {\n                                  s6 = peg$c64;\n                                  peg$currPos++;\n                                } else {\n                                  s6 = peg$FAILED;\n                                  if (peg$silentFails === 0) { peg$fail(peg$e68); }\n                                }\n                                if (s6 !== peg$FAILED) {\n                                  s7 = peg$currPos;\n                                  s8 = [];\n                                  s9 = peg$currPos;\n                                  s10 = peg$currPos;\n                                  peg$silentFails++;\n                                  s11 = peg$parseBlockTag();\n                                  peg$silentFails--;\n                                  if (s11 === peg$FAILED) {\n                                    s10 = undefined;\n                                  } else {\n                                    peg$currPos = s10;\n                                    s10 = peg$FAILED;\n                                  }\n                                  if (s10 !== peg$FAILED) {\n                                    s11 = peg$parsechar();\n                                    if (s11 !== peg$FAILED) {\n                                      s10 = [s10, s11];\n                                      s9 = s10;\n                                    } else {\n                                      peg$currPos = s9;\n                                      s9 = peg$FAILED;\n                                    }\n                                  } else {\n                                    peg$currPos = s9;\n                                    s9 = peg$FAILED;\n                                  }\n                                  while (s9 !== peg$FAILED) {\n                                    s8.push(s9);\n                                    s9 = peg$currPos;\n                                    s10 = peg$currPos;\n                                    peg$silentFails++;\n                                    s11 = peg$parseBlockTag();\n                                    peg$silentFails--;\n                                    if (s11 === peg$FAILED) {\n                                      s10 = undefined;\n                                    } else {\n                                      peg$currPos = s10;\n                                      s10 = peg$FAILED;\n                                    }\n                                    if (s10 !== peg$FAILED) {\n                                      s11 = peg$parsechar();\n                                      if (s11 !== peg$FAILED) {\n                                        s10 = [s10, s11];\n                                        s9 = s10;\n                                      } else {\n                                        peg$currPos = s9;\n                                        s9 = peg$FAILED;\n                                      }\n                                    } else {\n                                      peg$currPos = s9;\n                                      s9 = peg$FAILED;\n                                    }\n                                  }\n                                  s7 = input.substring(s7, peg$currPos);\n                                  s6 = [s6, s7];\n                                  s5 = s6;\n                                } else {\n                                  peg$currPos = s5;\n                                  s5 = peg$FAILED;\n                                }\n                                if (s5 !== peg$FAILED) {\n                                  s4 = input.substring(s4, peg$currPos);\n                                } else {\n                                  s4 = s5;\n                                }\n                                if (s4 !== peg$FAILED) {\n                                  s5 = peg$parseBlockTag();\n                                  if (s5 !== peg$FAILED) {\n                                    peg$savedPos = s0;\n                                    s0 = peg$f83(s4);\n                                  } else {\n                                    peg$currPos = s0;\n                                    s0 = peg$FAILED;\n                                  }\n                                } else {\n                                  peg$currPos = s0;\n                                  s0 = peg$FAILED;\n                                }\n                              } else {\n                                peg$currPos = s0;\n                                s0 = peg$FAILED;\n                              }\n                            } else {\n                              peg$currPos = s0;\n                              s0 = peg$FAILED;\n                            }\n                          } else {\n                            peg$currPos = s0;\n                            s0 = peg$FAILED;\n                          }\n                          if (s0 === peg$FAILED) {\n                            s0 = peg$currPos;\n                            if (input.substr(peg$currPos, 6) === peg$c65) {\n                              s1 = peg$c65;\n                              peg$currPos += 6;\n                            } else {\n                              s1 = peg$FAILED;\n                              if (peg$silentFails === 0) { peg$fail(peg$e69); }\n                            }\n                            if (s1 !== peg$FAILED) {\n                              s2 = peg$currPos;\n                              s3 = [];\n                              s4 = peg$currPos;\n                              s5 = peg$currPos;\n                              peg$silentFails++;\n                              s6 = peg$parseBlockTag();\n                              peg$silentFails--;\n                              if (s6 === peg$FAILED) {\n                                s5 = undefined;\n                              } else {\n                                peg$currPos = s5;\n                                s5 = peg$FAILED;\n                              }\n                              if (s5 !== peg$FAILED) {\n                                s6 = peg$parsechar();\n                                if (s6 !== peg$FAILED) {\n                                  s5 = [s5, s6];\n                                  s4 = s5;\n                                } else {\n                                  peg$currPos = s4;\n                                  s4 = peg$FAILED;\n                                }\n                              } else {\n                                peg$currPos = s4;\n                                s4 = peg$FAILED;\n                              }\n                              while (s4 !== peg$FAILED) {\n                                s3.push(s4);\n                                s4 = peg$currPos;\n                                s5 = peg$currPos;\n                                peg$silentFails++;\n                                s6 = peg$parseBlockTag();\n                                peg$silentFails--;\n                                if (s6 === peg$FAILED) {\n                                  s5 = undefined;\n                                } else {\n                                  peg$currPos = s5;\n                                  s5 = peg$FAILED;\n                                }\n                                if (s5 !== peg$FAILED) {\n                                  s6 = peg$parsechar();\n                                  if (s6 !== peg$FAILED) {\n                                    s5 = [s5, s6];\n                                    s4 = s5;\n                                  } else {\n                                    peg$currPos = s4;\n                                    s4 = peg$FAILED;\n                                  }\n                                } else {\n                                  peg$currPos = s4;\n                                  s4 = peg$FAILED;\n                                }\n                              }\n                              s2 = input.substring(s2, peg$currPos);\n                              s3 = peg$parseBlockTag();\n                              if (s3 !== peg$FAILED) {\n                                if (input.substr(peg$currPos, 9) === peg$c63) {\n                                  s4 = peg$c63;\n                                  peg$currPos += 9;\n                                } else {\n                                  s4 = peg$FAILED;\n                                  if (peg$silentFails === 0) { peg$fail(peg$e67); }\n                                }\n                                if (s4 !== peg$FAILED) {\n                                  s5 = peg$currPos;\n                                  s6 = peg$currPos;\n                                  if (input.charCodeAt(peg$currPos) === 80) {\n                                    s7 = peg$c64;\n                                    peg$currPos++;\n                                  } else {\n                                    s7 = peg$FAILED;\n                                    if (peg$silentFails === 0) { peg$fail(peg$e68); }\n                                  }\n                                  if (s7 !== peg$FAILED) {\n                                    s8 = peg$currPos;\n                                    s9 = [];\n                                    s10 = peg$currPos;\n                                    s11 = peg$currPos;\n                                    peg$silentFails++;\n                                    s12 = peg$parseBlockTag();\n                                    peg$silentFails--;\n                                    if (s12 === peg$FAILED) {\n                                      s11 = undefined;\n                                    } else {\n                                      peg$currPos = s11;\n                                      s11 = peg$FAILED;\n                                    }\n                                    if (s11 !== peg$FAILED) {\n                                      s12 = peg$parsechar();\n                                      if (s12 !== peg$FAILED) {\n                                        s11 = [s11, s12];\n                                        s10 = s11;\n                                      } else {\n                                        peg$currPos = s10;\n                                        s10 = peg$FAILED;\n                                      }\n                                    } else {\n                                      peg$currPos = s10;\n                                      s10 = peg$FAILED;\n                                    }\n                                    while (s10 !== peg$FAILED) {\n                                      s9.push(s10);\n                                      s10 = peg$currPos;\n                                      s11 = peg$currPos;\n                                      peg$silentFails++;\n                                      s12 = peg$parseBlockTag();\n                                      peg$silentFails--;\n                                      if (s12 === peg$FAILED) {\n                                        s11 = undefined;\n                                      } else {\n                                        peg$currPos = s11;\n                                        s11 = peg$FAILED;\n                                      }\n                                      if (s11 !== peg$FAILED) {\n                                        s12 = peg$parsechar();\n                                        if (s12 !== peg$FAILED) {\n                                          s11 = [s11, s12];\n                                          s10 = s11;\n                                        } else {\n                                          peg$currPos = s10;\n                                          s10 = peg$FAILED;\n                                        }\n                                      } else {\n                                        peg$currPos = s10;\n                                        s10 = peg$FAILED;\n                                      }\n                                    }\n                                    s8 = input.substring(s8, peg$currPos);\n                                    s7 = [s7, s8];\n                                    s6 = s7;\n                                  } else {\n                                    peg$currPos = s6;\n                                    s6 = peg$FAILED;\n                                  }\n                                  if (s6 !== peg$FAILED) {\n                                    s5 = input.substring(s5, peg$currPos);\n                                  } else {\n                                    s5 = s6;\n                                  }\n                                  if (s5 !== peg$FAILED) {\n                                    s6 = peg$parseBlockTag();\n                                    if (s6 !== peg$FAILED) {\n                                      peg$savedPos = s0;\n                                      s0 = peg$f84(s2, s5);\n                                    } else {\n                                      peg$currPos = s0;\n                                      s0 = peg$FAILED;\n                                    }\n                                  } else {\n                                    peg$currPos = s0;\n                                    s0 = peg$FAILED;\n                                  }\n                                } else {\n                                  peg$currPos = s0;\n                                  s0 = peg$FAILED;\n                                }\n                              } else {\n                                peg$currPos = s0;\n                                s0 = peg$FAILED;\n                              }\n                            } else {\n                              peg$currPos = s0;\n                              s0 = peg$FAILED;\n                            }\n                            if (s0 === peg$FAILED) {\n                              s0 = peg$currPos;\n                              if (input.substr(peg$currPos, 9) === peg$c66) {\n                                s1 = peg$c66;\n                                peg$currPos += 9;\n                              } else {\n                                s1 = peg$FAILED;\n                                if (peg$silentFails === 0) { peg$fail(peg$e70); }\n                              }\n                              if (s1 !== peg$FAILED) {\n                                s2 = peg$parseBlockTag();\n                                if (s2 !== peg$FAILED) {\n                                  if (input.substr(peg$currPos, 6) === peg$c67) {\n                                    s3 = peg$c67;\n                                    peg$currPos += 6;\n                                  } else {\n                                    s3 = peg$FAILED;\n                                    if (peg$silentFails === 0) { peg$fail(peg$e71); }\n                                  }\n                                  if (s3 !== peg$FAILED) {\n                                    s4 = peg$parseHighlightColor();\n                                    if (s4 !== peg$FAILED) {\n                                      s5 = peg$parseBlockTag();\n                                      if (s5 !== peg$FAILED) {\n                                        peg$savedPos = s0;\n                                        s0 = peg$f85(s4);\n                                      } else {\n                                        peg$currPos = s0;\n                                        s0 = peg$FAILED;\n                                      }\n                                    } else {\n                                      peg$currPos = s0;\n                                      s0 = peg$FAILED;\n                                    }\n                                  } else {\n                                    peg$currPos = s0;\n                                    s0 = peg$FAILED;\n                                  }\n                                } else {\n                                  peg$currPos = s0;\n                                  s0 = peg$FAILED;\n                                }\n                              } else {\n                                peg$currPos = s0;\n                                s0 = peg$FAILED;\n                              }\n                              if (s0 === peg$FAILED) {\n                                s0 = peg$currPos;\n                                if (input.substr(peg$currPos, 13) === peg$c68) {\n                                  s1 = peg$c68;\n                                  peg$currPos += 13;\n                                } else {\n                                  s1 = peg$FAILED;\n                                  if (peg$silentFails === 0) { peg$fail(peg$e72); }\n                                }\n                                if (s1 !== peg$FAILED) {\n                                  s2 = peg$parseBlockTag();\n                                  if (s2 !== peg$FAILED) {\n                                    if (input.substr(peg$currPos, 6) === peg$c67) {\n                                      s3 = peg$c67;\n                                      peg$currPos += 6;\n                                    } else {\n                                      s3 = peg$FAILED;\n                                      if (peg$silentFails === 0) { peg$fail(peg$e71); }\n                                    }\n                                    if (s3 !== peg$FAILED) {\n                                      s4 = peg$parseHighlightColor();\n                                      if (s4 !== peg$FAILED) {\n                                        s5 = peg$parseBlockTag();\n                                        if (s5 !== peg$FAILED) {\n                                          peg$savedPos = s0;\n                                          s0 = peg$f86(s4);\n                                        } else {\n                                          peg$currPos = s0;\n                                          s0 = peg$FAILED;\n                                        }\n                                      } else {\n                                        peg$currPos = s0;\n                                        s0 = peg$FAILED;\n                                      }\n                                    } else {\n                                      peg$currPos = s0;\n                                      s0 = peg$FAILED;\n                                    }\n                                  } else {\n                                    peg$currPos = s0;\n                                    s0 = peg$FAILED;\n                                  }\n                                } else {\n                                  peg$currPos = s0;\n                                  s0 = peg$FAILED;\n                                }\n                                if (s0 === peg$FAILED) {\n                                  s0 = peg$currPos;\n                                  if (input.substr(peg$currPos, 6) === peg$c67) {\n                                    s1 = peg$c67;\n                                    peg$currPos += 6;\n                                  } else {\n                                    s1 = peg$FAILED;\n                                    if (peg$silentFails === 0) { peg$fail(peg$e71); }\n                                  }\n                                  if (s1 !== peg$FAILED) {\n                                    s2 = peg$parseColor();\n                                    if (s2 !== peg$FAILED) {\n                                      s3 = peg$parseBlockTag();\n                                      if (s3 !== peg$FAILED) {\n                                        peg$savedPos = s0;\n                                        s0 = peg$f87(s2);\n                                      } else {\n                                        peg$currPos = s0;\n                                        s0 = peg$FAILED;\n                                      }\n                                    } else {\n                                      peg$currPos = s0;\n                                      s0 = peg$FAILED;\n                                    }\n                                  } else {\n                                    peg$currPos = s0;\n                                    s0 = peg$FAILED;\n                                  }\n                                  if (s0 === peg$FAILED) {\n                                    s0 = peg$currPos;\n                                    if (input.substr(peg$currPos, 12) === peg$c69) {\n                                      s1 = peg$c69;\n                                      peg$currPos += 12;\n                                    } else {\n                                      s1 = peg$FAILED;\n                                      if (peg$silentFails === 0) { peg$fail(peg$e73); }\n                                    }\n                                    if (s1 !== peg$FAILED) {\n                                      s2 = peg$currPos;\n                                      s3 = [];\n                                      s4 = peg$currPos;\n                                      s5 = peg$currPos;\n                                      peg$silentFails++;\n                                      s6 = peg$parseBlockTag();\n                                      peg$silentFails--;\n                                      if (s6 === peg$FAILED) {\n                                        s5 = undefined;\n                                      } else {\n                                        peg$currPos = s5;\n                                        s5 = peg$FAILED;\n                                      }\n                                      if (s5 !== peg$FAILED) {\n                                        s6 = peg$parsechar();\n                                        if (s6 !== peg$FAILED) {\n                                          s5 = [s5, s6];\n                                          s4 = s5;\n                                        } else {\n                                          peg$currPos = s4;\n                                          s4 = peg$FAILED;\n                                        }\n                                      } else {\n                                        peg$currPos = s4;\n                                        s4 = peg$FAILED;\n                                      }\n                                      while (s4 !== peg$FAILED) {\n                                        s3.push(s4);\n                                        s4 = peg$currPos;\n                                        s5 = peg$currPos;\n                                        peg$silentFails++;\n                                        s6 = peg$parseBlockTag();\n                                        peg$silentFails--;\n                                        if (s6 === peg$FAILED) {\n                                          s5 = undefined;\n                                        } else {\n                                          peg$currPos = s5;\n                                          s5 = peg$FAILED;\n                                        }\n                                        if (s5 !== peg$FAILED) {\n                                          s6 = peg$parsechar();\n                                          if (s6 !== peg$FAILED) {\n                                            s5 = [s5, s6];\n                                            s4 = s5;\n                                          } else {\n                                            peg$currPos = s4;\n                                            s4 = peg$FAILED;\n                                          }\n                                        } else {\n                                          peg$currPos = s4;\n                                          s4 = peg$FAILED;\n                                        }\n                                      }\n                                      s2 = input.substring(s2, peg$currPos);\n                                      s3 = peg$parseBlockTag();\n                                      if (s3 !== peg$FAILED) {\n                                        peg$savedPos = s0;\n                                        s0 = peg$f88(s2);\n                                      } else {\n                                        peg$currPos = s0;\n                                        s0 = peg$FAILED;\n                                      }\n                                    } else {\n                                      peg$currPos = s0;\n                                      s0 = peg$FAILED;\n                                    }\n                                    if (s0 === peg$FAILED) {\n                                      s0 = peg$currPos;\n                                      s1 = peg$parseAlternativeStyleTags();\n                                      if (s1 !== peg$FAILED) {\n                                        s2 = peg$parseBlockTag();\n                                        if (s2 !== peg$FAILED) {\n                                          peg$savedPos = s0;\n                                          s0 = peg$f89(s1);\n                                        } else {\n                                          peg$currPos = s0;\n                                          s0 = peg$FAILED;\n                                        }\n                                      } else {\n                                        peg$currPos = s0;\n                                        s0 = peg$FAILED;\n                                      }\n                                      if (s0 === peg$FAILED) {\n                                        s0 = peg$currPos;\n                                        if (input.charCodeAt(peg$currPos) === 35) {\n                                          s1 = peg$c21;\n                                          peg$currPos++;\n                                        } else {\n                                          s1 = peg$FAILED;\n                                          if (peg$silentFails === 0) { peg$fail(peg$e25); }\n                                        }\n                                        if (s1 !== peg$FAILED) {\n                                          s2 = peg$currPos;\n                                          s3 = [];\n                                          s4 = peg$currPos;\n                                          s5 = peg$currPos;\n                                          peg$silentFails++;\n                                          s6 = peg$parseBlockTag();\n                                          peg$silentFails--;\n                                          if (s6 === peg$FAILED) {\n                                            s5 = undefined;\n                                          } else {\n                                            peg$currPos = s5;\n                                            s5 = peg$FAILED;\n                                          }\n                                          if (s5 !== peg$FAILED) {\n                                            s6 = peg$parsechar();\n                                            if (s6 !== peg$FAILED) {\n                                              s5 = [s5, s6];\n                                              s4 = s5;\n                                            } else {\n                                              peg$currPos = s4;\n                                              s4 = peg$FAILED;\n                                            }\n                                          } else {\n                                            peg$currPos = s4;\n                                            s4 = peg$FAILED;\n                                          }\n                                          while (s4 !== peg$FAILED) {\n                                            s3.push(s4);\n                                            s4 = peg$currPos;\n                                            s5 = peg$currPos;\n                                            peg$silentFails++;\n                                            s6 = peg$parseBlockTag();\n                                            peg$silentFails--;\n                                            if (s6 === peg$FAILED) {\n                                              s5 = undefined;\n                                            } else {\n                                              peg$currPos = s5;\n                                              s5 = peg$FAILED;\n                                            }\n                                            if (s5 !== peg$FAILED) {\n                                              s6 = peg$parsechar();\n                                              if (s6 !== peg$FAILED) {\n                                                s5 = [s5, s6];\n                                                s4 = s5;\n                                              } else {\n                                                peg$currPos = s4;\n                                                s4 = peg$FAILED;\n                                              }\n                                            } else {\n                                              peg$currPos = s4;\n                                              s4 = peg$FAILED;\n                                            }\n                                          }\n                                          s2 = input.substring(s2, peg$currPos);\n                                          s3 = peg$parseBlockTag();\n                                          if (s3 !== peg$FAILED) {\n                                            peg$savedPos = s0;\n                                            s0 = peg$f90(s2);\n                                          } else {\n                                            peg$currPos = s0;\n                                            s0 = peg$FAILED;\n                                          }\n                                        } else {\n                                          peg$currPos = s0;\n                                          s0 = peg$FAILED;\n                                        }\n                                      }\n                                    }\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseRefsChain() {\n    let s0, s1;\n\n    s0 = [];\n    s1 = peg$parseRef();\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = peg$parseRef();\n    }\n\n    return s0;\n  }\n\n  function peg$parseRef() {\n    let s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c70) {\n      s1 = peg$c70;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e74); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = peg$currPos;\n      s5 = peg$currPos;\n      peg$silentFails++;\n      s6 = peg$parseBlockTag();\n      peg$silentFails--;\n      if (s6 === peg$FAILED) {\n        s5 = undefined;\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parsechar();\n        if (s6 !== peg$FAILED) {\n          s5 = [s5, s6];\n          s4 = s5;\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$parseBlockTag();\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parsechar();\n          if (s6 !== peg$FAILED) {\n            s5 = [s5, s6];\n            s4 = s5;\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      peg$savedPos = s0;\n      s0 = peg$f91(s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAlternativeStyleTags() {\n    let s0;\n\n    if (input.substr(peg$currPos, 4) === peg$c71) {\n      s0 = peg$c71;\n      peg$currPos += 4;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e75); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 6) === peg$c72) {\n        s0 = peg$c72;\n        peg$currPos += 6;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e76); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 5) === peg$c73) {\n          s0 = peg$c73;\n          peg$currPos += 5;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e77); }\n        }\n        if (s0 === peg$FAILED) {\n          if (input.substr(peg$currPos, 15) === peg$c74) {\n            s0 = peg$c74;\n            peg$currPos += 15;\n          } else {\n            s0 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e78); }\n          }\n          if (s0 === peg$FAILED) {\n            if (input.substr(peg$currPos, 15) === peg$c75) {\n              s0 = peg$c75;\n              peg$currPos += 15;\n            } else {\n              s0 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e79); }\n            }\n            if (s0 === peg$FAILED) {\n              if (input.substr(peg$currPos, 14) === peg$c76) {\n                s0 = peg$c76;\n                peg$currPos += 14;\n              } else {\n                s0 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e80); }\n              }\n              if (s0 === peg$FAILED) {\n                if (input.substr(peg$currPos, 13) === peg$c77) {\n                  s0 = peg$c77;\n                  peg$currPos += 13;\n                } else {\n                  s0 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e81); }\n                }\n                if (s0 === peg$FAILED) {\n                  if (input.substr(peg$currPos, 15) === peg$c78) {\n                    s0 = peg$c78;\n                    peg$currPos += 15;\n                  } else {\n                    s0 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e82); }\n                  }\n                  if (s0 === peg$FAILED) {\n                    if (input.substr(peg$currPos, 13) === peg$c79) {\n                      s0 = peg$c79;\n                      peg$currPos += 13;\n                    } else {\n                      s0 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e83); }\n                    }\n                    if (s0 === peg$FAILED) {\n                      if (input.substr(peg$currPos, 14) === peg$c80) {\n                        s0 = peg$c80;\n                        peg$currPos += 14;\n                      } else {\n                        s0 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e84); }\n                      }\n                      if (s0 === peg$FAILED) {\n                        if (input.substr(peg$currPos, 14) === peg$c81) {\n                          s0 = peg$c81;\n                          peg$currPos += 14;\n                        } else {\n                          s0 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e85); }\n                        }\n                        if (s0 === peg$FAILED) {\n                          if (input.substr(peg$currPos, 14) === peg$c82) {\n                            s0 = peg$c82;\n                            peg$currPos += 14;\n                          } else {\n                            s0 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$e86); }\n                          }\n                          if (s0 === peg$FAILED) {\n                            if (input.substr(peg$currPos, 13) === peg$c83) {\n                              s0 = peg$c83;\n                              peg$currPos += 13;\n                            } else {\n                              s0 = peg$FAILED;\n                              if (peg$silentFails === 0) { peg$fail(peg$e87); }\n                            }\n                            if (s0 === peg$FAILED) {\n                              if (input.substr(peg$currPos, 9) === peg$c66) {\n                                s0 = peg$c66;\n                                peg$currPos += 9;\n                              } else {\n                                s0 = peg$FAILED;\n                                if (peg$silentFails === 0) { peg$fail(peg$e70); }\n                              }\n                              if (s0 === peg$FAILED) {\n                                if (input.substr(peg$currPos, 6) === peg$c84) {\n                                  s0 = peg$c84;\n                                  peg$currPos += 6;\n                                } else {\n                                  s0 = peg$FAILED;\n                                  if (peg$silentFails === 0) { peg$fail(peg$e88); }\n                                }\n                                if (s0 === peg$FAILED) {\n                                  if (input.substr(peg$currPos, 9) === peg$c85) {\n                                    s0 = peg$c85;\n                                    peg$currPos += 9;\n                                  } else {\n                                    s0 = peg$FAILED;\n                                    if (peg$silentFails === 0) { peg$fail(peg$e89); }\n                                  }\n                                  if (s0 === peg$FAILED) {\n                                    if (input.substr(peg$currPos, 11) === peg$c86) {\n                                      s0 = peg$c86;\n                                      peg$currPos += 11;\n                                    } else {\n                                      s0 = peg$FAILED;\n                                      if (peg$silentFails === 0) { peg$fail(peg$e90); }\n                                    }\n                                    if (s0 === peg$FAILED) {\n                                      if (input.substr(peg$currPos, 3) === peg$c87) {\n                                        s0 = peg$c87;\n                                        peg$currPos += 3;\n                                      } else {\n                                        s0 = peg$FAILED;\n                                        if (peg$silentFails === 0) { peg$fail(peg$e91); }\n                                      }\n                                      if (s0 === peg$FAILED) {\n                                        if (input.substr(peg$currPos, 3) === peg$c88) {\n                                          s0 = peg$c88;\n                                          peg$currPos += 3;\n                                        } else {\n                                          s0 = peg$FAILED;\n                                          if (peg$silentFails === 0) { peg$fail(peg$e92); }\n                                        }\n                                        if (s0 === peg$FAILED) {\n                                          if (input.substr(peg$currPos, 9) === peg$c89) {\n                                            s0 = peg$c89;\n                                            peg$currPos += 9;\n                                          } else {\n                                            s0 = peg$FAILED;\n                                            if (peg$silentFails === 0) { peg$fail(peg$e93); }\n                                          }\n                                          if (s0 === peg$FAILED) {\n                                            if (input.substr(peg$currPos, 15) === peg$c90) {\n                                              s0 = peg$c90;\n                                              peg$currPos += 15;\n                                            } else {\n                                              s0 = peg$FAILED;\n                                              if (peg$silentFails === 0) { peg$fail(peg$e94); }\n                                            }\n                                            if (s0 === peg$FAILED) {\n                                              if (input.substr(peg$currPos, 9) === peg$c91) {\n                                                s0 = peg$c91;\n                                                peg$currPos += 9;\n                                              } else {\n                                                s0 = peg$FAILED;\n                                                if (peg$silentFails === 0) { peg$fail(peg$e95); }\n                                              }\n                                              if (s0 === peg$FAILED) {\n                                                if (input.substr(peg$currPos, 6) === peg$c92) {\n                                                  s0 = peg$c92;\n                                                  peg$currPos += 6;\n                                                } else {\n                                                  s0 = peg$FAILED;\n                                                  if (peg$silentFails === 0) { peg$fail(peg$e96); }\n                                                }\n                                                if (s0 === peg$FAILED) {\n                                                  if (input.substr(peg$currPos, 13) === peg$c93) {\n                                                    s0 = peg$c93;\n                                                    peg$currPos += 13;\n                                                  } else {\n                                                    s0 = peg$FAILED;\n                                                    if (peg$silentFails === 0) { peg$fail(peg$e97); }\n                                                  }\n                                                  if (s0 === peg$FAILED) {\n                                                    if (input.substr(peg$currPos, 16) === peg$c94) {\n                                                      s0 = peg$c94;\n                                                      peg$currPos += 16;\n                                                    } else {\n                                                      s0 = peg$FAILED;\n                                                      if (peg$silentFails === 0) { peg$fail(peg$e98); }\n                                                    }\n                                                    if (s0 === peg$FAILED) {\n                                                      if (input.substr(peg$currPos, 16) === peg$c95) {\n                                                        s0 = peg$c95;\n                                                        peg$currPos += 16;\n                                                      } else {\n                                                        s0 = peg$FAILED;\n                                                        if (peg$silentFails === 0) { peg$fail(peg$e99); }\n                                                      }\n                                                      if (s0 === peg$FAILED) {\n                                                        if (input.substr(peg$currPos, 15) === peg$c96) {\n                                                          s0 = peg$c96;\n                                                          peg$currPos += 15;\n                                                        } else {\n                                                          s0 = peg$FAILED;\n                                                          if (peg$silentFails === 0) { peg$fail(peg$e100); }\n                                                        }\n                                                        if (s0 === peg$FAILED) {\n                                                          if (input.substr(peg$currPos, 14) === peg$c97) {\n                                                            s0 = peg$c97;\n                                                            peg$currPos += 14;\n                                                          } else {\n                                                            s0 = peg$FAILED;\n                                                            if (peg$silentFails === 0) { peg$fail(peg$e101); }\n                                                          }\n                                                          if (s0 === peg$FAILED) {\n                                                            if (input.substr(peg$currPos, 16) === peg$c98) {\n                                                              s0 = peg$c98;\n                                                              peg$currPos += 16;\n                                                            } else {\n                                                              s0 = peg$FAILED;\n                                                              if (peg$silentFails === 0) { peg$fail(peg$e102); }\n                                                            }\n                                                            if (s0 === peg$FAILED) {\n                                                              if (input.substr(peg$currPos, 14) === peg$c99) {\n                                                                s0 = peg$c99;\n                                                                peg$currPos += 14;\n                                                              } else {\n                                                                s0 = peg$FAILED;\n                                                                if (peg$silentFails === 0) { peg$fail(peg$e103); }\n                                                              }\n                                                              if (s0 === peg$FAILED) {\n                                                                if (input.substr(peg$currPos, 15) === peg$c100) {\n                                                                  s0 = peg$c100;\n                                                                  peg$currPos += 15;\n                                                                } else {\n                                                                  s0 = peg$FAILED;\n                                                                  if (peg$silentFails === 0) { peg$fail(peg$e104); }\n                                                                }\n                                                                if (s0 === peg$FAILED) {\n                                                                  if (input.substr(peg$currPos, 15) === peg$c101) {\n                                                                    s0 = peg$c101;\n                                                                    peg$currPos += 15;\n                                                                  } else {\n                                                                    s0 = peg$FAILED;\n                                                                    if (peg$silentFails === 0) { peg$fail(peg$e105); }\n                                                                  }\n                                                                  if (s0 === peg$FAILED) {\n                                                                    if (input.substr(peg$currPos, 15) === peg$c102) {\n                                                                      s0 = peg$c102;\n                                                                      peg$currPos += 15;\n                                                                    } else {\n                                                                      s0 = peg$FAILED;\n                                                                      if (peg$silentFails === 0) { peg$fail(peg$e106); }\n                                                                    }\n                                                                    if (s0 === peg$FAILED) {\n                                                                      if (input.substr(peg$currPos, 14) === peg$c103) {\n                                                                        s0 = peg$c103;\n                                                                        peg$currPos += 14;\n                                                                      } else {\n                                                                        s0 = peg$FAILED;\n                                                                        if (peg$silentFails === 0) { peg$fail(peg$e107); }\n                                                                      }\n                                                                      if (s0 === peg$FAILED) {\n                                                                        if (input.substr(peg$currPos, 10) === peg$c104) {\n                                                                          s0 = peg$c104;\n                                                                          peg$currPos += 10;\n                                                                        } else {\n                                                                          s0 = peg$FAILED;\n                                                                          if (peg$silentFails === 0) { peg$fail(peg$e108); }\n                                                                        }\n                                                                        if (s0 === peg$FAILED) {\n                                                                          if (input.substr(peg$currPos, 13) === peg$c105) {\n                                                                            s0 = peg$c105;\n                                                                            peg$currPos += 13;\n                                                                          } else {\n                                                                            s0 = peg$FAILED;\n                                                                            if (peg$silentFails === 0) { peg$fail(peg$e109); }\n                                                                          }\n                                                                          if (s0 === peg$FAILED) {\n                                                                            if (input.substr(peg$currPos, 19) === peg$c106) {\n                                                                              s0 = peg$c106;\n                                                                              peg$currPos += 19;\n                                                                            } else {\n                                                                              s0 = peg$FAILED;\n                                                                              if (peg$silentFails === 0) { peg$fail(peg$e110); }\n                                                                            }\n                                                                            if (s0 === peg$FAILED) {\n                                                                              if (input.substr(peg$currPos, 10) === peg$c107) {\n                                                                                s0 = peg$c107;\n                                                                                peg$currPos += 10;\n                                                                              } else {\n                                                                                s0 = peg$FAILED;\n                                                                                if (peg$silentFails === 0) { peg$fail(peg$e111); }\n                                                                              }\n                                                                              if (s0 === peg$FAILED) {\n                                                                                if (input.substr(peg$currPos, 10) === peg$c108) {\n                                                                                  s0 = peg$c108;\n                                                                                  peg$currPos += 10;\n                                                                                } else {\n                                                                                  s0 = peg$FAILED;\n                                                                                  if (peg$silentFails === 0) { peg$fail(peg$e112); }\n                                                                                }\n                                                                                if (s0 === peg$FAILED) {\n                                                                                  if (input.substr(peg$currPos, 13) === peg$c68) {\n                                                                                    s0 = peg$c68;\n                                                                                    peg$currPos += 13;\n                                                                                  } else {\n                                                                                    s0 = peg$FAILED;\n                                                                                    if (peg$silentFails === 0) { peg$fail(peg$e72); }\n                                                                                  }\n                                                                                  if (s0 === peg$FAILED) {\n                                                                                    if (input.substr(peg$currPos, 11) === peg$c109) {\n                                                                                      s0 = peg$c109;\n                                                                                      peg$currPos += 11;\n                                                                                    } else {\n                                                                                      s0 = peg$FAILED;\n                                                                                      if (peg$silentFails === 0) { peg$fail(peg$e113); }\n                                                                                    }\n                                                                                  }\n                                                                                }\n                                                                              }\n                                                                            }\n                                                                          }\n                                                                        }\n                                                                      }\n                                                                    }\n                                                                  }\n                                                                }\n                                                              }\n                                                            }\n                                                          }\n                                                        }\n                                                      }\n                                                    }\n                                                  }\n                                                }\n                                              }\n                                            }\n                                          }\n                                        }\n                                      }\n                                    }\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseColor() {\n    let s0;\n\n    if (input.substr(peg$currPos, 4) === peg$c110) {\n      s0 = peg$c110;\n      peg$currPos += 4;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e114); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 5) === peg$c111) {\n        s0 = peg$c111;\n        peg$currPos += 5;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e115); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 4) === peg$c112) {\n          s0 = peg$c112;\n          peg$currPos += 4;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e116); }\n        }\n        if (s0 === peg$FAILED) {\n          if (input.substr(peg$currPos, 5) === peg$c113) {\n            s0 = peg$c113;\n            peg$currPos += 5;\n          } else {\n            s0 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e117); }\n          }\n          if (s0 === peg$FAILED) {\n            if (input.substr(peg$currPos, 7) === peg$c114) {\n              s0 = peg$c114;\n              peg$currPos += 7;\n            } else {\n              s0 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e118); }\n            }\n            if (s0 === peg$FAILED) {\n              if (input.substr(peg$currPos, 9) === peg$c115) {\n                s0 = peg$c115;\n                peg$currPos += 9;\n              } else {\n                s0 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e119); }\n              }\n              if (s0 === peg$FAILED) {\n                if (input.substr(peg$currPos, 4) === peg$c116) {\n                  s0 = peg$c116;\n                  peg$currPos += 4;\n                } else {\n                  s0 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e120); }\n                }\n                if (s0 === peg$FAILED) {\n                  if (input.substr(peg$currPos, 8) === peg$c117) {\n                    s0 = peg$c117;\n                    peg$currPos += 8;\n                  } else {\n                    s0 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e121); }\n                  }\n                  if (s0 === peg$FAILED) {\n                    if (input.substr(peg$currPos, 5) === peg$c118) {\n                      s0 = peg$c118;\n                      peg$currPos += 5;\n                    } else {\n                      s0 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e122); }\n                    }\n                    if (s0 === peg$FAILED) {\n                      if (input.substr(peg$currPos, 4) === peg$c119) {\n                        s0 = peg$c119;\n                        peg$currPos += 4;\n                      } else {\n                        s0 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e123); }\n                      }\n                      if (s0 === peg$FAILED) {\n                        if (input.substr(peg$currPos, 7) === peg$c120) {\n                          s0 = peg$c120;\n                          peg$currPos += 7;\n                        } else {\n                          s0 = peg$FAILED;\n                          if (peg$silentFails === 0) { peg$fail(peg$e124); }\n                        }\n                        if (s0 === peg$FAILED) {\n                          if (input.substr(peg$currPos, 6) === peg$c121) {\n                            s0 = peg$c121;\n                            peg$currPos += 6;\n                          } else {\n                            s0 = peg$FAILED;\n                            if (peg$silentFails === 0) { peg$fail(peg$e125); }\n                          }\n                          if (s0 === peg$FAILED) {\n                            if (input.substr(peg$currPos, 4) === peg$c122) {\n                              s0 = peg$c122;\n                              peg$currPos += 4;\n                            } else {\n                              s0 = peg$FAILED;\n                              if (peg$silentFails === 0) { peg$fail(peg$e126); }\n                            }\n                            if (s0 === peg$FAILED) {\n                              if (input.substr(peg$currPos, 5) === peg$c123) {\n                                s0 = peg$c123;\n                                peg$currPos += 5;\n                              } else {\n                                s0 = peg$FAILED;\n                                if (peg$silentFails === 0) { peg$fail(peg$e127); }\n                              }\n                              if (s0 === peg$FAILED) {\n                                if (input.substr(peg$currPos, 6) === peg$c124) {\n                                  s0 = peg$c124;\n                                  peg$currPos += 6;\n                                } else {\n                                  s0 = peg$FAILED;\n                                  if (peg$silentFails === 0) { peg$fail(peg$e128); }\n                                }\n                                if (s0 === peg$FAILED) {\n                                  if (input.substr(peg$currPos, 4) === peg$c125) {\n                                    s0 = peg$c125;\n                                    peg$currPos += 4;\n                                  } else {\n                                    s0 = peg$FAILED;\n                                    if (peg$silentFails === 0) { peg$fail(peg$e129); }\n                                  }\n                                  if (s0 === peg$FAILED) {\n                                    if (input.substr(peg$currPos, 6) === peg$c126) {\n                                      s0 = peg$c126;\n                                      peg$currPos += 6;\n                                    } else {\n                                      s0 = peg$FAILED;\n                                      if (peg$silentFails === 0) { peg$fail(peg$e130); }\n                                    }\n                                    if (s0 === peg$FAILED) {\n                                      if (input.substr(peg$currPos, 3) === peg$c127) {\n                                        s0 = peg$c127;\n                                        peg$currPos += 3;\n                                      } else {\n                                        s0 = peg$FAILED;\n                                        if (peg$silentFails === 0) { peg$fail(peg$e131); }\n                                      }\n                                      if (s0 === peg$FAILED) {\n                                        if (input.substr(peg$currPos, 6) === peg$c128) {\n                                          s0 = peg$c128;\n                                          peg$currPos += 6;\n                                        } else {\n                                          s0 = peg$FAILED;\n                                          if (peg$silentFails === 0) { peg$fail(peg$e132); }\n                                        }\n                                        if (s0 === peg$FAILED) {\n                                          if (input.substr(peg$currPos, 4) === peg$c129) {\n                                            s0 = peg$c129;\n                                            peg$currPos += 4;\n                                          } else {\n                                            s0 = peg$FAILED;\n                                            if (peg$silentFails === 0) { peg$fail(peg$e133); }\n                                          }\n                                          if (s0 === peg$FAILED) {\n                                            if (input.substr(peg$currPos, 6) === peg$c130) {\n                                              s0 = peg$c130;\n                                              peg$currPos += 6;\n                                            } else {\n                                              s0 = peg$FAILED;\n                                              if (peg$silentFails === 0) { peg$fail(peg$e134); }\n                                            }\n                                            if (s0 === peg$FAILED) {\n                                              if (input.substr(peg$currPos, 5) === peg$c131) {\n                                                s0 = peg$c131;\n                                                peg$currPos += 5;\n                                              } else {\n                                                s0 = peg$FAILED;\n                                                if (peg$silentFails === 0) { peg$fail(peg$e135); }\n                                              }\n                                              if (s0 === peg$FAILED) {\n                                                if (input.substr(peg$currPos, 6) === peg$c132) {\n                                                  s0 = peg$c132;\n                                                  peg$currPos += 6;\n                                                } else {\n                                                  s0 = peg$FAILED;\n                                                  if (peg$silentFails === 0) { peg$fail(peg$e136); }\n                                                }\n                                              }\n                                            }\n                                          }\n                                        }\n                                      }\n                                    }\n                                  }\n                                }\n                              }\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseHighlightColor() {\n    let s0;\n\n    if (input.substr(peg$currPos, 6) === peg$c124) {\n      s0 = peg$c124;\n      peg$currPos += 6;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e128); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 6) === peg$c132) {\n        s0 = peg$c132;\n        peg$currPos += 6;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e136); }\n      }\n      if (s0 === peg$FAILED) {\n        if (input.substr(peg$currPos, 5) === peg$c118) {\n          s0 = peg$c118;\n          peg$currPos += 5;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e122); }\n        }\n        if (s0 === peg$FAILED) {\n          if (input.substr(peg$currPos, 4) === peg$c112) {\n            s0 = peg$c112;\n            peg$currPos += 4;\n          } else {\n            s0 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e116); }\n          }\n          if (s0 === peg$FAILED) {\n            if (input.substr(peg$currPos, 6) === peg$c126) {\n              s0 = peg$c126;\n              peg$currPos += 6;\n            } else {\n              s0 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e130); }\n            }\n            if (s0 === peg$FAILED) {\n              if (input.substr(peg$currPos, 4) === peg$c125) {\n                s0 = peg$c125;\n                peg$currPos += 4;\n              } else {\n                s0 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e129); }\n              }\n              if (s0 === peg$FAILED) {\n                if (input.substr(peg$currPos, 5) === peg$c113) {\n                  s0 = peg$c113;\n                  peg$currPos += 5;\n                } else {\n                  s0 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e117); }\n                }\n                if (s0 === peg$FAILED) {\n                  if (input.substr(peg$currPos, 5) === peg$c131) {\n                    s0 = peg$c131;\n                    peg$currPos += 5;\n                  } else {\n                    s0 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e135); }\n                  }\n                  if (s0 === peg$FAILED) {\n                    if (input.substr(peg$currPos, 5) === peg$c111) {\n                      s0 = peg$c111;\n                      peg$currPos += 5;\n                    } else {\n                      s0 = peg$FAILED;\n                      if (peg$silentFails === 0) { peg$fail(peg$e115); }\n                    }\n                    if (s0 === peg$FAILED) {\n                      if (input.substr(peg$currPos, 4) === peg$c116) {\n                        s0 = peg$c116;\n                        peg$currPos += 4;\n                      } else {\n                        s0 = peg$FAILED;\n                        if (peg$silentFails === 0) { peg$fail(peg$e120); }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parsebitmarkMinusMinus() {\n    let s0, s1;\n\n    peg$silentFails++;\n    s0 = peg$currPos;\n    s1 = peg$parsebitmarkMinusMinusString();\n    peg$savedPos = s0;\n    s1 = peg$f92(s1);\n    s0 = s1;\n    peg$silentFails--;\n\n    return s0;\n  }\n\n  function peg$parsebitmarkMinusMinusString() {\n    let s0, s1, s2, s3;\n\n    peg$silentFails++;\n    s0 = peg$currPos;\n    s1 = peg$parsePlainText();\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = [];\n    s3 = peg$parseStyledText();\n    if (s3 === peg$FAILED) {\n      s3 = peg$parsePlainText();\n    }\n    while (s3 !== peg$FAILED) {\n      s2.push(s3);\n      s3 = peg$parseStyledText();\n      if (s3 === peg$FAILED) {\n        s3 = peg$parsePlainText();\n      }\n    }\n    peg$savedPos = s0;\n    s0 = peg$f93(s1, s2);\n    peg$silentFails--;\n\n    return s0;\n  }\n\n  function peg$parsePlainText() {\n    let s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseNL();\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f94();\n    }\n    s0 = s1;\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$currPos;\n      s2 = [];\n      s3 = peg$currPos;\n      s4 = peg$parseTagTags();\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      s5 = peg$currPos;\n      peg$silentFails++;\n      s6 = peg$parseStyledText();\n      peg$silentFails--;\n      if (s6 === peg$FAILED) {\n        s5 = undefined;\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parsechar();\n        if (s6 !== peg$FAILED) {\n          s4 = [s4, s5, s6];\n          s3 = s4;\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 === peg$FAILED) {\n        s3 = peg$currPos;\n        s4 = peg$parseTagTags();\n        if (s4 !== peg$FAILED) {\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$parseStyledText();\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s4 = [s4, s5];\n            s3 = s4;\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      }\n      if (s3 !== peg$FAILED) {\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          s3 = peg$currPos;\n          s4 = peg$parseTagTags();\n          if (s4 === peg$FAILED) {\n            s4 = null;\n          }\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$parseStyledText();\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            s6 = peg$parsechar();\n            if (s6 !== peg$FAILED) {\n              s4 = [s4, s5, s6];\n              s3 = s4;\n            } else {\n              peg$currPos = s3;\n              s3 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n          if (s3 === peg$FAILED) {\n            s3 = peg$currPos;\n            s4 = peg$parseTagTags();\n            if (s4 !== peg$FAILED) {\n              s5 = peg$currPos;\n              peg$silentFails++;\n              s6 = peg$parseStyledText();\n              peg$silentFails--;\n              if (s6 === peg$FAILED) {\n                s5 = undefined;\n              } else {\n                peg$currPos = s5;\n                s5 = peg$FAILED;\n              }\n              if (s5 !== peg$FAILED) {\n                s4 = [s4, s5];\n                s3 = s4;\n              } else {\n                peg$currPos = s3;\n                s3 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s3;\n              s3 = peg$FAILED;\n            }\n          }\n        }\n      } else {\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        s1 = input.substring(s1, peg$currPos);\n      } else {\n        s1 = s2;\n      }\n      if (s1 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s1 = peg$f95(s1);\n      }\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBoldHalfTag() {\n    let s0;\n\n    if (input.charCodeAt(peg$currPos) === 42) {\n      s0 = peg$c133;\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e137); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseItalicHalfTag() {\n    let s0;\n\n    if (input.charCodeAt(peg$currPos) === 95) {\n      s0 = peg$c134;\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e138); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseLightHalfTag() {\n    let s0;\n\n    if (input.charCodeAt(peg$currPos) === 96) {\n      s0 = peg$c135;\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e139); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseHighlightHalfTag() {\n    let s0;\n\n    if (input.charCodeAt(peg$currPos) === 33) {\n      s0 = peg$c136;\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e140); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseBoldTag() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseBoldHalfTag();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseBoldHalfTag();\n      if (s2 !== peg$FAILED) {\n        s1 = [s1, s2];\n        s0 = s1;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseItalicTag() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseItalicHalfTag();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseItalicHalfTag();\n      if (s2 !== peg$FAILED) {\n        s1 = [s1, s2];\n        s0 = s1;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseLightTag() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseLightHalfTag();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseLightHalfTag();\n      if (s2 !== peg$FAILED) {\n        s1 = [s1, s2];\n        s0 = s1;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseHighlightTag() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseHighlightHalfTag();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseHighlightHalfTag();\n      if (s2 !== peg$FAILED) {\n        s1 = [s1, s2];\n        s0 = s1;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBodyBitOpenTag() {\n    let s0;\n\n    if (input.substr(peg$currPos, 2) === peg$c137) {\n      s0 = peg$c137;\n      peg$currPos += 2;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e141); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseBodyBitCloseTag() {\n    let s0;\n\n    if (input.charCodeAt(peg$currPos) === 93) {\n      s0 = peg$c138;\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e142); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseStyledText() {\n    let s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$parseBodyBitOpenTag();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r1.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      if (s4 !== peg$FAILED) {\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = input.charAt(peg$currPos);\n          if (peg$r1.test(s4)) {\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e15); }\n          }\n        }\n      } else {\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = input.substring(s2, peg$currPos);\n      } else {\n        s2 = s3;\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseBodyBitCloseTag();\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f96(s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$parseBoldTag();\n      if (s1 !== peg$FAILED) {\n        s2 = peg$currPos;\n        s3 = [];\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$parseBoldTag();\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          if (input.length > peg$currPos) {\n            s6 = input.charAt(peg$currPos);\n            peg$currPos++;\n          } else {\n            s6 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e0); }\n          }\n          if (s6 !== peg$FAILED) {\n            s5 = [s5, s6];\n            s4 = s5;\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$parseBoldTag();\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            if (input.length > peg$currPos) {\n              s6 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e0); }\n            }\n            if (s6 !== peg$FAILED) {\n              s5 = [s5, s6];\n              s4 = s5;\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        }\n        s2 = input.substring(s2, peg$currPos);\n        s3 = peg$parseBoldTag();\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f97(s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n      if (s0 === peg$FAILED) {\n        s0 = peg$currPos;\n        s1 = peg$parseItalicTag();\n        if (s1 !== peg$FAILED) {\n          s2 = peg$currPos;\n          s3 = [];\n          s4 = peg$currPos;\n          s5 = peg$currPos;\n          peg$silentFails++;\n          s6 = peg$parseItalicTag();\n          peg$silentFails--;\n          if (s6 === peg$FAILED) {\n            s5 = undefined;\n          } else {\n            peg$currPos = s5;\n            s5 = peg$FAILED;\n          }\n          if (s5 !== peg$FAILED) {\n            if (input.length > peg$currPos) {\n              s6 = input.charAt(peg$currPos);\n              peg$currPos++;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e0); }\n            }\n            if (s6 !== peg$FAILED) {\n              s5 = [s5, s6];\n              s4 = s5;\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n          while (s4 !== peg$FAILED) {\n            s3.push(s4);\n            s4 = peg$currPos;\n            s5 = peg$currPos;\n            peg$silentFails++;\n            s6 = peg$parseItalicTag();\n            peg$silentFails--;\n            if (s6 === peg$FAILED) {\n              s5 = undefined;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n            if (s5 !== peg$FAILED) {\n              if (input.length > peg$currPos) {\n                s6 = input.charAt(peg$currPos);\n                peg$currPos++;\n              } else {\n                s6 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e0); }\n              }\n              if (s6 !== peg$FAILED) {\n                s5 = [s5, s6];\n                s4 = s5;\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n          }\n          s2 = input.substring(s2, peg$currPos);\n          s3 = peg$parseItalicTag();\n          if (s3 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f98(s2);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n        if (s0 === peg$FAILED) {\n          s0 = peg$currPos;\n          s1 = peg$parseLightTag();\n          if (s1 !== peg$FAILED) {\n            s2 = peg$currPos;\n            s3 = [];\n            s4 = peg$currPos;\n            s5 = peg$currPos;\n            peg$silentFails++;\n            s6 = peg$parseLightTag();\n            peg$silentFails--;\n            if (s6 === peg$FAILED) {\n              s5 = undefined;\n            } else {\n              peg$currPos = s5;\n              s5 = peg$FAILED;\n            }\n            if (s5 !== peg$FAILED) {\n              if (input.length > peg$currPos) {\n                s6 = input.charAt(peg$currPos);\n                peg$currPos++;\n              } else {\n                s6 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e0); }\n              }\n              if (s6 !== peg$FAILED) {\n                s5 = [s5, s6];\n                s4 = s5;\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s4;\n              s4 = peg$FAILED;\n            }\n            while (s4 !== peg$FAILED) {\n              s3.push(s4);\n              s4 = peg$currPos;\n              s5 = peg$currPos;\n              peg$silentFails++;\n              s6 = peg$parseLightTag();\n              peg$silentFails--;\n              if (s6 === peg$FAILED) {\n                s5 = undefined;\n              } else {\n                peg$currPos = s5;\n                s5 = peg$FAILED;\n              }\n              if (s5 !== peg$FAILED) {\n                if (input.length > peg$currPos) {\n                  s6 = input.charAt(peg$currPos);\n                  peg$currPos++;\n                } else {\n                  s6 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                }\n                if (s6 !== peg$FAILED) {\n                  s5 = [s5, s6];\n                  s4 = s5;\n                } else {\n                  peg$currPos = s4;\n                  s4 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n            }\n            s2 = input.substring(s2, peg$currPos);\n            s3 = peg$parseLightTag();\n            if (s3 !== peg$FAILED) {\n              peg$savedPos = s0;\n              s0 = peg$f99(s2);\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n          if (s0 === peg$FAILED) {\n            s0 = peg$currPos;\n            s1 = peg$parseHighlightTag();\n            if (s1 !== peg$FAILED) {\n              s2 = peg$currPos;\n              s3 = [];\n              s4 = peg$currPos;\n              s5 = peg$currPos;\n              peg$silentFails++;\n              s6 = peg$parseHighlightTag();\n              peg$silentFails--;\n              if (s6 === peg$FAILED) {\n                s5 = undefined;\n              } else {\n                peg$currPos = s5;\n                s5 = peg$FAILED;\n              }\n              if (s5 !== peg$FAILED) {\n                if (input.length > peg$currPos) {\n                  s6 = input.charAt(peg$currPos);\n                  peg$currPos++;\n                } else {\n                  s6 = peg$FAILED;\n                  if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                }\n                if (s6 !== peg$FAILED) {\n                  s5 = [s5, s6];\n                  s4 = s5;\n                } else {\n                  peg$currPos = s4;\n                  s4 = peg$FAILED;\n                }\n              } else {\n                peg$currPos = s4;\n                s4 = peg$FAILED;\n              }\n              while (s4 !== peg$FAILED) {\n                s3.push(s4);\n                s4 = peg$currPos;\n                s5 = peg$currPos;\n                peg$silentFails++;\n                s6 = peg$parseHighlightTag();\n                peg$silentFails--;\n                if (s6 === peg$FAILED) {\n                  s5 = undefined;\n                } else {\n                  peg$currPos = s5;\n                  s5 = peg$FAILED;\n                }\n                if (s5 !== peg$FAILED) {\n                  if (input.length > peg$currPos) {\n                    s6 = input.charAt(peg$currPos);\n                    peg$currPos++;\n                  } else {\n                    s6 = peg$FAILED;\n                    if (peg$silentFails === 0) { peg$fail(peg$e0); }\n                  }\n                  if (s6 !== peg$FAILED) {\n                    s5 = [s5, s6];\n                    s4 = s5;\n                  } else {\n                    peg$currPos = s4;\n                    s4 = peg$FAILED;\n                  }\n                } else {\n                  peg$currPos = s4;\n                  s4 = peg$FAILED;\n                }\n              }\n              s2 = input.substring(s2, peg$currPos);\n              s3 = peg$parseHighlightTag();\n              if (s3 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f100(s2);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          }\n        }\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseTagTags() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$parseLightTag();\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = peg$parseLightHalfTag();\n      if (s4 !== peg$FAILED) {\n        while (s4 !== peg$FAILED) {\n          s3.push(s4);\n          s4 = peg$parseLightHalfTag();\n        }\n      } else {\n        s3 = peg$FAILED;\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = [s2, s3];\n        s1 = s2;\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$currPos;\n      s2 = peg$parseHighlightTag();\n      if (s2 !== peg$FAILED) {\n        s3 = [];\n        s4 = peg$parseHighlightHalfTag();\n        if (s4 !== peg$FAILED) {\n          while (s4 !== peg$FAILED) {\n            s3.push(s4);\n            s4 = peg$parseHighlightHalfTag();\n          }\n        } else {\n          s3 = peg$FAILED;\n        }\n        if (s3 !== peg$FAILED) {\n          s2 = [s2, s3];\n          s1 = s2;\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n      if (s1 !== peg$FAILED) {\n        s0 = input.substring(s0, peg$currPos);\n      } else {\n        s0 = s1;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    let s0, s1;\n\n    peg$silentFails++;\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s0 = peg$c139;\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e144); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 2) === peg$c140) {\n        s0 = peg$c140;\n        peg$currPos += 2;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e145); }\n      }\n      if (s0 === peg$FAILED) {\n        s0 = input.charAt(peg$currPos);\n        if (peg$r2.test(s0)) {\n          peg$currPos++;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e146); }\n        }\n      }\n    }\n    peg$silentFails--;\n    if (s0 === peg$FAILED) {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e143); }\n    }\n\n    return s0;\n  }\n\n  function peg$parsechar() {\n    let s0;\n\n    s0 = input.charAt(peg$currPos);\n    if (peg$r3.test(s0)) {\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e147); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseEOL() {\n    let s0, s1;\n\n    s0 = peg$parseNL();\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e0); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseUrlHttp() {\n    let s0, s1, s2, s3, s4, s5, s6, s7, s8;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    if (input.substr(peg$currPos, 4) === peg$c141) {\n      s2 = peg$c141;\n      peg$currPos += 4;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e148); }\n    }\n    if (s2 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 115) {\n        s3 = peg$c142;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e149); }\n      }\n      if (s3 === peg$FAILED) {\n        s3 = null;\n      }\n      if (input.substr(peg$currPos, 3) === peg$c143) {\n        s4 = peg$c143;\n        peg$currPos += 3;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e150); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = [];\n        s6 = peg$currPos;\n        s7 = peg$currPos;\n        peg$silentFails++;\n        s8 = peg$parseBlockTag();\n        peg$silentFails--;\n        if (s8 === peg$FAILED) {\n          s7 = undefined;\n        } else {\n          peg$currPos = s7;\n          s7 = peg$FAILED;\n        }\n        if (s7 !== peg$FAILED) {\n          s8 = peg$parseUrlChars();\n          if (s8 !== peg$FAILED) {\n            s7 = [s7, s8];\n            s6 = s7;\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s6;\n          s6 = peg$FAILED;\n        }\n        while (s6 !== peg$FAILED) {\n          s5.push(s6);\n          s6 = peg$currPos;\n          s7 = peg$currPos;\n          peg$silentFails++;\n          s8 = peg$parseBlockTag();\n          peg$silentFails--;\n          if (s8 === peg$FAILED) {\n            s7 = undefined;\n          } else {\n            peg$currPos = s7;\n            s7 = peg$FAILED;\n          }\n          if (s7 !== peg$FAILED) {\n            s8 = peg$parseUrlChars();\n            if (s8 !== peg$FAILED) {\n              s7 = [s7, s8];\n              s6 = s7;\n            } else {\n              peg$currPos = s6;\n              s6 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s6;\n            s6 = peg$FAILED;\n          }\n        }\n        s2 = [s2, s3, s4, s5];\n        s1 = s2;\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseUrl() {\n    let s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$currPos;\n    if (input.substr(peg$currPos, 4) === peg$c141) {\n      s3 = peg$c141;\n      peg$currPos += 4;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e148); }\n    }\n    if (s3 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 115) {\n        s4 = peg$c142;\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e149); }\n      }\n      if (s4 === peg$FAILED) {\n        s4 = null;\n      }\n      if (input.substr(peg$currPos, 3) === peg$c143) {\n        s5 = peg$c143;\n        peg$currPos += 3;\n      } else {\n        s5 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e150); }\n      }\n      if (s5 !== peg$FAILED) {\n        s3 = [s3, s4, s5];\n        s2 = s3;\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 === peg$FAILED) {\n      if (input.substr(peg$currPos, 7) === peg$c144) {\n        s2 = peg$c144;\n        peg$currPos += 7;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e151); }\n      }\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = peg$currPos;\n      s5 = peg$currPos;\n      peg$silentFails++;\n      s6 = peg$parseBlockTag();\n      peg$silentFails--;\n      if (s6 === peg$FAILED) {\n        s5 = undefined;\n      } else {\n        peg$currPos = s5;\n        s5 = peg$FAILED;\n      }\n      if (s5 !== peg$FAILED) {\n        s6 = peg$parseUrlChars();\n        if (s6 !== peg$FAILED) {\n          s5 = [s5, s6];\n          s4 = s5;\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s4;\n        s4 = peg$FAILED;\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$currPos;\n        s5 = peg$currPos;\n        peg$silentFails++;\n        s6 = peg$parseBlockTag();\n        peg$silentFails--;\n        if (s6 === peg$FAILED) {\n          s5 = undefined;\n        } else {\n          peg$currPos = s5;\n          s5 = peg$FAILED;\n        }\n        if (s5 !== peg$FAILED) {\n          s6 = peg$parseUrlChars();\n          if (s6 !== peg$FAILED) {\n            s5 = [s5, s6];\n            s4 = s5;\n          } else {\n            peg$currPos = s4;\n            s4 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s4;\n          s4 = peg$FAILED;\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      peg$savedPos = s0;\n      s0 = peg$f101(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseUrlChars() {\n    let s0;\n\n    s0 = input.charAt(peg$currPos);\n    if (peg$r4.test(s0)) {\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e152); }\n    }\n\n    return s0;\n  }\n\n\n    var indentStack = [], indent = \"\"\n\n    // Trim trailing whitespace. This runs on every (nested) parse, so it also trims the\n    // trailing whitespace of title text (\"# Title \\t\"), which is passed to a nested parse\n    // untrimmed by the TitleBlock rule.\n    input = input.replace(/\\s+$/, \"\")\n\n    input = input.trimStart()\n\n  peg$result = peg$startRuleFunction();\n\n  const peg$success = (peg$result !== peg$FAILED && peg$currPos === input.length);\n  function peg$throw() {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? peg$getUnicode(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos,\n      peg$success,\n      peg$throw: peg$success ? undefined : peg$throw,\n    });\n  }\n  if (peg$success) {\n    return peg$result;\n  } else {\n    peg$throw();\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"version\",\n  \"bitmarkPlusPlus\",\n  \"bitmarkPlus\",\n  \"bitmarkMinusMinus\",\n  \"bitmarkPlusString\",\n  \"bitmarkMinusMinusString\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n// grammar-sha256: e393bc888e6b279e9deb4b4cb2bc31b52eff7dfc0e41703cf65b43bb46eabbb7\n","import { parse as _parse } from '../../../generated/parser/text/text-peggy-parser.js';\nimport { type TextAst } from '../../../model/ast/TextNodes.ts';\n\ninterface ParseOptions {\n  startRule?: string;\n}\n\ntype Parse = (str: string, options?: ParseOptions) => TextAst | string;\n\nconst parse: Parse = _parse;\n\nexport { parse };\n","import { type JsonText, type TextAst } from '../../model/ast/TextNodes.ts';\nimport { type TextFormatType } from '../../model/enum/TextFormat.ts';\nimport { TextLocation, type TextLocationType } from '../../model/enum/TextLocation.ts';\nimport { TextNodeType } from '../../model/enum/TextNodeType.ts';\nimport { type BodyBitJson } from '../../model/json/BodyBitJson.ts';\nimport { StringUtils } from '../../utils/StringUtils.ts';\nimport { parse as bitmarkTextParse } from './peg/TextPegParser.ts';\n\nexport interface BitmarkTextParserOptions {\n  format: TextFormatType;\n  location: TextLocationType;\n}\n\nclass TextParser {\n  /**\n   * Get the version of the text parser\n   */\n  version(): string {\n    return bitmarkTextParse('', {\n      startRule: 'version',\n    }) as string;\n  }\n\n  /**\n   * Preprocess bitmark text AST into a standard format (TextAst object) from bitmark text AST either as a string\n   * or a plain JS object\n   *\n   * @param ast - bitmark text AST as a string or a plain JS object\n   * @returns bitmark text AST in a standard format (BitmarkAst object)\n   */\n  preprocessAst(ast: string | unknown): TextAst | undefined {\n    if (StringUtils.isString(ast)) {\n      const str = ast as string;\n      try {\n        ast = JSON.parse(str);\n      } catch (_e) {\n        // Failed to parse JSON, return empty array\n        return undefined;\n      }\n    }\n\n    if (this.isAst(ast)) {\n      return ast as TextAst;\n    }\n    return undefined;\n  }\n\n  /**\n   * Check if a plain JS object is valid text AST\n   *\n   * @param ast - a plain JS object that might be text AST\n   * @returns true if text AST, otherwise false\n   */\n  isAst(ast: unknown): boolean {\n    if (Array.isArray(ast)) {\n      if (ast.length === 0) return true;\n\n      if (Object.prototype.hasOwnProperty.call(ast[0], 'type')) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Convert Bitmark text to text AST.\n   *\n   * The Bitmark text should be a string.\n   * If parsed bitmark text AST is passed to this function, it will be returned as is.\n   *\n   * @param text - bitmark text\n   * @returns bitmark text AST as plain JS object\n   */\n  toAst(text: string | TextAst | undefined, options: BitmarkTextParserOptions): TextAst {\n    // If input is not a string, return it as is\n    if (Array.isArray(text)) return text;\n    let str = (text as string) ?? '';\n\n    // If the str is empty, return an empty array (as otherwise the parser will\n    // return an empty paragraph which is unnecessary)\n    if (!str) return [];\n\n    // Ensure options is an object\n    const opts = Object.assign({}, options);\n\n    // Set the start rule.\n    // The start rule is bitmark++ for the body, and bitmark+ for the tags\n    // Otherwise, the start rule is bitmarkMinusMinus\n    let startRule = 'bitmarkPlusPlus';\n    if (opts.location === TextLocation.tag) {\n      startRule = 'bitmarkPlus';\n    }\n\n    // Always trim the string before parsing (parser handles leading/trailing whitespace inconsistently)\n    str = str.trim();\n\n    return bitmarkTextParse(str, {\n      startRule,\n    }) as TextAst;\n  }\n\n  /**\n   * Extract all the body bits from the text AST\n   *\n   * @param text\n   * @returns\n   */\n  public extractBodyBits(text: JsonText): BodyBitJson[] {\n    if (!Array.isArray(text)) return [];\n\n    const bodyBits: BodyBitJson[] = [];\n    const textAst = text as TextAst;\n    for (const node of textAst) {\n      switch (node.type) {\n        case TextNodeType.gap:\n        case TextNodeType.select:\n        case TextNodeType.highlight:\n        case TextNodeType.mark:\n          bodyBits.push(node as BodyBitJson);\n          break;\n        default: {\n          // Recurse into children\n          const bits = this.extractBodyBits(node.content as TextAst);\n          for (const bit of bits) {\n            bodyBits.push(bit);\n          }\n        }\n      }\n    }\n\n    return bodyBits;\n  }\n\n  /**\n   * Walk all the body bits from the text AST\n   *\n   * @param text\n   * @returns\n   */\n  public walkBodyBits(\n    text: JsonText,\n    callback: (parent: TextAst, index: number, bodyBit: BodyBitJson) => void,\n  ): void {\n    if (!Array.isArray(text)) return;\n\n    const textAst = text as TextAst;\n    for (let i = 0; i < textAst.length; i++) {\n      const node = textAst[i];\n      switch (node.type) {\n        case TextNodeType.gap:\n        case TextNodeType.select:\n        case TextNodeType.highlight:\n        case TextNodeType.mark:\n          callback(textAst, i, node as BodyBitJson);\n          break;\n        default: {\n          // Recurse into children\n          this.walkBodyBits(node.content as TextAst, callback);\n        }\n      }\n    }\n  }\n}\n\nexport { TextParser };\n","class BooleanUtils {\n  /**\n   * Check if an object is a boolean.\n   *\n   * @param val input value\n   * @returns the input value if it is an array, otherwise a new array containing the input value\n   */\n  isBoolean(val: unknown | undefined): boolean {\n    if (val === true) return true;\n    if (val === false) return true;\n    return false;\n  }\n\n  /**\n   * Check if an object is a boolean, or a boolean string.\n   *\n   * @param val input value\n   * @returns the input value if it is an array, otherwise a new array containing the input value\n   */\n  isBooleanString(val: unknown | undefined): boolean {\n    if (this.isBoolean(val)) return true;\n    if (val === 'true') return true;\n    if (val === 'false') return true;\n    return false;\n  }\n\n  /**\n   * Convert a value to a boolean.\n   *\n   * By default, the return will be false unless the value is truthy (true, \"true\").\n   * Setting defaultVal to true will return true unless the value is falsy (false, \"false\").\n   *\n   * @param val input value\n   * @param defaultVal default value to return if val does not match a boolean or 'true' / 'false'\n   * @returns val, converted to a boolean\n   */\n  toBoolean(val: unknown | undefined, defaultVal?: boolean): boolean {\n    if (defaultVal) {\n      if (val === false) return false;\n      if (val === 'false') return false;\n      return true;\n    } else {\n      if (val === true) return true;\n      if (val === 'true') return true;\n      return false;\n    }\n  }\n}\n\nconst instance = new BooleanUtils();\n\nexport { instance as BooleanUtils };\n","class NumberUtils {\n  /**\n   * Convert a value to a number, unless it is already a number.\n   *\n   * The value returned if conversion cannot be performed defaults to undefined but can be configured\n   * via defaultVal.\n   *\n   * @param val input value\n   * @param defaultVal value to return if conversion cannot be performed\n   * @returns the input value if it is an array, otherwise a new array containing the input value\n   */\n  asNumber<T extends number | undefined>(val: unknown | undefined, defaultVal?: T): number | T {\n    if (val == null) return (defaultVal ?? undefined) as T;\n    const number = +val;\n    if (Number.isNaN(number) || !isFinite(number)) return (defaultVal ?? undefined) as T;\n\n    return number;\n  }\n\n  /**\n   * Return true if the input value IS or CAN BE converted to a number.\n   *\n   * e.g.\n   * 123 -> true\n   * 123.45 -> true\n   * '123' -> true\n   * '123.45' -> true\n   * '-123.45' -> true\n   * '+123.45' -> true\n   * '0xAc1' -> true\n   * '0xAc1' -> true\n   * '0b101' -> true\n   * '0o701' -> true\n   * '1e4' -> true\n   * '1e-4' -> true\n   * '++1e-4' -> false\n   * '7^2' -> false\n   * '0xFFG' -> false\n   * '0b121' -> false\n   * '0o781' -> false\n   * '1x10e4' -> false\n   * '123abc' -> false\n   * 'abc' -> false\n   * null -> false\n   *\n   * @param val input value\n   *\n   * @returns true if the input value can be converted to a number.\n   */\n  isNumeric(val: unknown): boolean {\n    if (val == null) return false;\n\n    const number = +val;\n    return !Number.isNaN(number) && isFinite(number);\n  }\n}\n\nconst instance = new NumberUtils();\n\nexport { instance as NumberUtils };\n","import { Breakscape } from '../breakscaping/Breakscape.ts';\nimport { Config } from '../config/Config.ts';\nimport { TextGenerator } from '../generator/text/TextGenerator.ts';\nimport { type Property } from '../model/ast/Nodes.ts';\nimport { type JsonText, type TextAst } from '../model/ast/TextNodes.ts';\nimport { BitConfig } from '../model/config/BitConfig.ts';\nimport type { ConfigKeyType } from '../model/config/enum/ConfigKey.ts';\nimport type { PropertyTagConfig } from '../model/config/PropertyTagConfig.ts';\nimport { type BitTypeType } from '../model/enum/BitType.ts';\nimport { TagFormat } from '../model/enum/TagFormat.ts';\nimport { type TextFormatType } from '../model/enum/TextFormat.ts';\nimport { TextLocation, type TextLocationType } from '../model/enum/TextLocation.ts';\nimport { type ExampleJson } from '../model/json/BitJson.ts';\nimport { TextParser } from '../parser/text/TextParser.ts';\nimport { BooleanUtils } from '../utils/BooleanUtils.ts';\nimport { NumberUtils } from '../utils/NumberUtils.ts';\nimport { StringUtils } from '../utils/StringUtils.ts';\n\nexport interface WithExampleJson {\n  isExample: boolean;\n  example: ExampleJson;\n  __defaultExample?: ExampleJson;\n}\n\nexport interface BuildContext {\n  bitConfig: BitConfig;\n  bitType: BitTypeType;\n  textFormat: TextFormatType;\n}\n\nexport interface ToAstPropertyOptions {\n  cardSet?: {\n    sideNo: number; // Side number of the card set\n    variantNo: number; // Variant number of the card set\n  };\n}\n\nclass BaseBuilder {\n  protected textParser: TextParser;\n  protected textGenerator: TextGenerator;\n\n  constructor() {\n    this.textParser = new TextParser();\n    this.textGenerator = new TextGenerator();\n  }\n\n  /**\n   * Convert example to an Example.\n   * - If example is set, then the isExample will be true and example with be example as a BreakscapedText.\n   * - Else if __isDefaultExample is true, then __isDefaultExample / isExample will both be true.\n   * - Else __isDefaultExample / isExample will both be false.\n   *\n   * @param __isDefaultExample - true if the example is the default value\n   * @param example - the example to convert (BreakscapedText, boolean) or undefined if none / default\n   * @returns example/__isDefaultExample resolved to an Example object\n   */\n  protected toExample(\n    __isDefaultExample: boolean | undefined,\n    example: TextAst | string | boolean | undefined | null,\n    defaultExample?: TextAst | string | boolean | undefined | null,\n  ): WithExampleJson {\n    // Example\n    if (example != undefined) {\n      let exampleValue: JsonText | boolean | null;\n\n      // If the default example is a boolean, then the example should be a boolean\n      if (BooleanUtils.isBoolean(defaultExample)) {\n        exampleValue = BooleanUtils.toBoolean(example);\n      } else {\n        exampleValue = example;\n      }\n\n      return {\n        isExample: true,\n        example: exampleValue,\n        __defaultExample: defaultExample ?? null,\n      };\n    }\n\n    // Default example\n    if (__isDefaultExample) {\n      return {\n        isExample: true,\n        example: defaultExample ?? null,\n        __defaultExample: defaultExample ?? null,\n      };\n    }\n\n    // Not an example\n    return {\n      isExample: false,\n      example: null,\n      __defaultExample: defaultExample ?? null,\n    };\n  }\n\n  /**\n   * Convert a raw bitmark property to an AST property.\n   *\n   * @param key\n   * @param value\n   * @param options\n   * @returns\n   */\n  protected toAstProperty(\n    bitType: BitTypeType,\n    key: ConfigKeyType,\n    value: unknown | unknown[] | undefined,\n    options: ToAstPropertyOptions | undefined,\n  ): Property | undefined {\n    if (value == null) return undefined;\n\n    const bitConfig = Config.getBitConfig(bitType);\n    let tagsConfig = bitConfig.tags;\n    if (options?.cardSet) {\n      const { sideNo, variantNo } = options.cardSet;\n      const cardTagsConfig = Config.getTagsConfigForCardSet(bitType, sideNo, variantNo);\n      tagsConfig = cardTagsConfig ?? tagsConfig;\n    }\n\n    const propertyConfig = Config.getTagConfigForTag(tagsConfig, key) as\n      PropertyTagConfig | undefined;\n\n    // Convert to array or single value if needed\n    if (propertyConfig?.array && !Array.isArray(value)) {\n      value = [value];\n    } else if (!propertyConfig?.array && Array.isArray(value)) {\n      value = value[value.length - 1];\n    }\n\n    // Convert property as needed\n    const processValue = (v: unknown): Property | undefined => {\n      if (v == null) return undefined;\n      const format = propertyConfig?.format ?? TagFormat.plainText;\n      switch (format) {\n        case TagFormat.plainText:\n          // Convert number to string\n          if (NumberUtils.asNumber(v) != null) v = `${v}`;\n\n          return StringUtils.isString(v) ? StringUtils.trimmedString(v) : undefined;\n\n        case TagFormat.number:\n          return NumberUtils.asNumber(v);\n\n        case TagFormat.boolean:\n          return BooleanUtils.toBoolean(v, true);\n\n        case TagFormat.invertedBoolean:\n          return !BooleanUtils.toBoolean(v, true);\n      }\n      return v as Property;\n    };\n    if (Array.isArray(value)) {\n      const valueArray = value as unknown[];\n      for (let i = 0, len = valueArray.length; i < len; i++) {\n        valueArray[i] = processValue(valueArray[i]);\n      }\n    } else {\n      value = processValue(value);\n    }\n\n    return value as Property;\n  }\n\n  protected getEmptyTextAst(context: BuildContext): TextAst {\n    return this.handleJsonText(context, TextLocation.tag, ' ');\n  }\n\n  /**\n   * Convert the JsonText from the JSON to the AST format:\n   * Input:\n   *  - Bitmark v2: breakscaped string\n   *  - Bitmark v3: bitmark text JSON (TextAst)\n   * Output:\n   *  - bitmark text JSON (TextAst) with __tag property to indicate item is text\n   *\n   * In the case of Bitmark v2 type texts, there is nothing to do but cast the type.\n   *\n   * @param context BuildContext\n   * @param textFormat format of TextAst\n   * @param textLocation location of the text (body, tag, etc.)\n   * @param text JsonText or JsonText[] to convert\n   * @returns Breakscaped string or breakscaped string[]\n   */\n  protected handleJsonText<\n    T extends JsonText | JsonText[] | undefined,\n    R = T extends JsonText[] ? TextAst[] : TextAst,\n  >(context: BuildContext, textLocation: TextLocationType, text: T): R {\n    let res: R;\n\n    const { textFormat } = context;\n\n    if (text == null) {\n      res = [] as R;\n    } else {\n      if (this.textParser.isAst(text)) {\n        // Use the text generator to convert the TextAst to breakscaped string\n        // this.ast.printTree(text, NodeType.textAst);\n\n        res = text as R;\n      } else if (Array.isArray(text)) {\n        const strArray: TextAst[] = [];\n        for (let i = 0, len = text.length; i < len; i++) {\n          const t = text[i];\n\n          if (this.textParser.isAst(t)) {\n            // Use the text generator to convert the TextAst to breakscaped string\n            // this.ast.printTree(text, NodeType.textAst);\n            strArray[i] = t as TextAst;\n          } else if (StringUtils.isString(t)) {\n            strArray[i] = this.textParser.toAst(\n              Breakscape.breakscape(t as string, {\n                format: textFormat,\n                location: textLocation,\n              }),\n              {\n                format: textFormat,\n                location: textLocation,\n              },\n            );\n            // eslint-disable-next-line @typescript-eslint/no-explicit-any\n            (strArray[i] as any).__tag = 'text';\n          } else {\n            // Invalid data\n            strArray[i] = [];\n          }\n        }\n        // Return the array of TextAst texts\n        return strArray as R;\n      } else if (StringUtils.isString(text)) {\n        // v2 text(?)\n        res = this.textParser.toAst(\n          Breakscape.breakscape(text as string, {\n            format: textFormat,\n            location: textLocation,\n            v2: true,\n          }),\n          {\n            format: textFormat,\n            location: textLocation,\n          },\n        ) as R;\n      } else {\n        // Invalid data\n        res = [] as R;\n      }\n    }\n\n    // Add the __tag property to indicate this is a text item\n    // This is somewhat ugly, but otherwise we would need an AST structure that is not so similar to the JSON\n    // resulting in a lot more conversion code\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    (res as any).__tag = 'text';\n\n    return res;\n  }\n\n  // /**\n  //  * Remove any property with a key starting with an underscore.\n  //  *\n  //  * @param json\n  //  */\n  // protected removeTemporaryProperties(json: Record<string, unknown> | unknown[]): void {\n  //   const obj = json as Record<string, unknown>;\n  //   for (const key in obj) {\n  //     if (key.startsWith('_')) {\n  //       delete obj[key];\n  //     } else if (typeof obj[key] === 'object') {\n  //       this.removeTemporaryProperties(obj[key] as Record<string, unknown>);\n  //     }\n  //   }\n  // }\n}\n\nexport { BaseBuilder };\n","import { type WithExampleJson } from '../ast/BaseBuilder.ts';\nimport { type TextAst } from '../model/ast/TextNodes.ts';\nimport { type TextFormatType } from '../model/enum/TextFormat.ts';\nimport { TextLocation } from '../model/enum/TextLocation.ts';\nimport { type ExampleJson } from '../model/json/BitJson.ts';\nimport { TextParser } from '../parser/text/TextParser.ts';\nimport { BooleanUtils } from './BooleanUtils.ts';\n\nconst textParser = new TextParser();\n\nclass BitUtils {\n  /**\n   * Helper function to fill in the example / isExample of a node based on the values of __isDefaultExample and example.\n   * This function if for 'string' examples.\n   *\n   * @param nodes\n   * @param __isDefaultExample\n   * @param example\n   * @param firstOnly\n   * @returns\n   */\n  fillStringExample(\n    textFormat: TextFormatType,\n    nodes: WithExampleJson | WithExampleJson[],\n    __isDefaultExample: boolean | undefined,\n    example: ExampleJson | undefined,\n    firstOnly: boolean,\n  ) {\n    if (!nodes) return;\n    if (!Array.isArray(nodes)) nodes = [nodes];\n\n    for (const node of nodes) {\n      if (!node.isExample) {\n        if (__isDefaultExample) {\n          node.example = node.__defaultExample as ExampleJson;\n          node.isExample = true;\n        } else {\n          // node.__isDefaultExample = false;\n          node.example = (\n            example\n              ? textParser.toAst(example as TextAst, {\n                  format: textFormat,\n                  location: TextLocation.tag,\n                })\n              : undefined\n          ) as ExampleJson;\n        }\n        if (firstOnly) break;\n      }\n    }\n  }\n\n  /**\n   * Helper function to fill in the example / isExample of a node based on the values of __isDefaultExample and example.\n   * This function if for 'boolean' examples.\n   *\n   * @param nodes\n   * @param __isDefaultExample\n   * @param example\n   * @param firstCorrectOnly\n   * @returns\n   */\n  fillBooleanExample(\n    nodes: WithExampleJson | WithExampleJson[],\n    __isDefaultExample: boolean | undefined,\n    example: ExampleJson | undefined,\n    firstCorrectOnly: boolean,\n  ) {\n    if (!nodes) return;\n    if (!Array.isArray(nodes)) nodes = [nodes];\n\n    for (const node of nodes) {\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      if (!node.isExample && (!firstCorrectOnly || (node as any).isCorrect)) {\n        if (__isDefaultExample) {\n          node.example = node.__defaultExample as ExampleJson;\n          node.isExample = true;\n        } else {\n          // node.__isDefaultExample = false;\n          node.example = BooleanUtils.toBoolean(example);\n        }\n        if (firstCorrectOnly) break;\n      }\n    }\n  }\n}\n\nconst instance = new BitUtils();\n\nexport { instance as BitUtils };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { Breakscape } from '../breakscaping/Breakscape.ts';\nimport { Config } from '../config/Config.ts';\nimport { type TextAst } from '../model/ast/TextNodes.ts';\nimport { BitType } from '../model/enum/BitType.ts';\nimport {\n  ResourceType,\n  resourceTypeToConfigKey,\n  type ResourceTypeType,\n} from '../model/enum/ResourceType.ts';\nimport { TextLocation } from '../model/enum/TextLocation.ts';\nimport {\n  type AppLinkResourceWrapperJson,\n  type ArticleResourceWrapperJson,\n  type AudioEmbedResourceWrapperJson,\n  type AudioLinkResourceWrapperJson,\n  type AudioResourceWrapperJson,\n  type DocumentDownloadResourceWrapperJson,\n  type DocumentEmbedResourceWrapperJson,\n  type DocumentLinkResourceWrapperJson,\n  type DocumentResourceWrapperJson,\n  type ImageLinkResourceWrapperJson,\n  type ImageResourceJson,\n  type ImageResourceWrapperJson,\n  type ImageResponsiveResourceJson,\n  type ResourceDataJson,\n  type ResourceJson,\n  type StillImageFilmEmbedResourceWrapperJson,\n  type StillImageFilmLinkResourceWrapperJson,\n  type StillImageFilmResourceJson,\n  type VideoEmbedResourceWrapperJson,\n  type VideoLinkResourceWrapperJson,\n  type VideoResourceWrapperJson,\n  type WebsiteLinkResourceWrapperJson,\n} from '../model/json/ResourceJson.ts';\nimport { ObjectUtils } from '../utils/ObjectUtils.ts';\nimport { StringUtils } from '../utils/StringUtils.ts';\nimport { UrlUtils } from '../utils/UrlUtils.ts';\nimport { BaseBuilder, type BuildContext } from './BaseBuilder.ts';\nimport { NodeValidator } from './rules/NodeValidator.ts';\n\n/**\n * Builder to build bitmark Resource AST nodes programmatically\n */\nclass ResourceBuilder extends BaseBuilder {\n  /**\n   * Build and validate resource JSON object(s) from external resource JSON object(s)\n   *\n   * Note: a single input resource object can be converted to multiple resource objects\n   * (e.g. stillImageFilm -> image + audio)\n   *\n   * @param bitType\n   * @param resource\n   * @returns\n   */\n  public resourceFromResourceJson(\n    context: BuildContext,\n    resource?: Partial<ResourceJson> | Partial<ResourceJson>[],\n  ): ResourceJson | ResourceJson[] | undefined {\n    if (!resource) return undefined;\n\n    const nodes: ResourceJson[] | undefined = [];\n\n    // Convert single resource to array\n    if (!Array.isArray(resource)) resource = [resource];\n\n    for (const thisResource of resource) {\n      // Validate we have a valid resource type\n      let type = Enum(ResourceType).fromValue(thisResource.type);\n      if (!type) return undefined;\n\n      // Get the resource key\n      const resourceKey = Enum(ResourceType).keyFromValue(type);\n      if (!resourceKey) return undefined;\n\n      // Override original type with type alias if present\n      const __typeAlias = Enum(ResourceType).fromValue(thisResource.__typeAlias);\n      type = __typeAlias ?? type;\n\n      let data: ResourceDataJson | undefined;\n\n      // TODO: This code should use the config to handle the combo resources. For now the logic is hardcoded\n\n      // Handle special cases for multiple resource bits (imageResponsive, stillImageFilm)\n      if (type === ResourceType.imageResponsive) {\n        const r = thisResource as unknown as ImageResponsiveResourceJson;\n        const imagePortraitNode = this.resourceFromResourceDataJson(\n          context,\n          ResourceType.imagePortrait,\n          r.imagePortrait,\n        );\n        const imageLandscapeNode = this.resourceFromResourceDataJson(\n          context,\n          ResourceType.imageLandscape,\n          r.imageLandscape,\n        );\n        if (imagePortraitNode) nodes.push(imagePortraitNode);\n        if (imageLandscapeNode) nodes.push(imageLandscapeNode);\n      } else if (type === ResourceType.stillImageFilm) {\n        const r = thisResource as unknown as StillImageFilmResourceJson;\n        const imageNode = this.resourceFromResourceDataJson(context, ResourceType.image, r.image);\n        const audioNode = this.resourceFromResourceDataJson(context, ResourceType.audio, r.audio);\n        if (imageNode) nodes.push(imageNode);\n        if (audioNode) nodes.push(audioNode);\n      } else {\n        // Standard single resource case\n\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        data = (thisResource as any)[resourceKey];\n\n        if (!data) return undefined;\n\n        const node = this.resourceFromResourceDataJson(context, type, data);\n        if (node) nodes.push(node);\n      }\n    }\n\n    if (nodes.length === 0) return undefined;\n    if (nodes.length === 1) return nodes[0];\n    return nodes;\n  }\n\n  public resourceFromResourceDataJson(\n    context: BuildContext,\n    type: ResourceTypeType,\n    data: Partial<ResourceDataJson> | undefined,\n  ): ResourceJson | undefined {\n    if (!data) return undefined;\n    type = Enum(ResourceType).fromValue(type) as ResourceTypeType;\n    if (!type) return undefined;\n\n    const dataAsString: string | undefined = StringUtils.isString(data)\n      ? (data as unknown as string)\n      : undefined;\n\n    // url / src / href / app\n    const url = data.url || data.src || data.body || dataAsString;\n\n    // Sub resources\n    const posterImage = data.posterImage\n      ? (\n          this.resourceFromResourceDataJson(\n            context,\n            ResourceType.image,\n            data.posterImage,\n          ) as ImageResourceWrapperJson\n        )?.image\n      : undefined;\n    const thumbnails = data.thumbnails\n      ? data.thumbnails.map((t) => {\n          return (\n            this.resourceFromResourceDataJson(\n              context,\n              ResourceType.image,\n              t,\n            ) as ImageResourceWrapperJson\n          )?.image;\n        })\n      : undefined;\n\n    // Resource\n    const node = this.resource(context, {\n      type,\n\n      // Generic (except Article / Document)\n      value: url,\n\n      // Alternative source\n      srcAlt: data.srcAlt,\n\n      // ImageLikeResource / AudioLikeResource / VideoLikeResource / Article / Document\n      format: data.format,\n\n      // ImageLikeResource\n      src1x: data.src1x,\n      src2x: data.src2x,\n      src3x: data.src3x,\n      src4x: data.src4x,\n      caption: this.handleJsonText(context, TextLocation.tag, data.caption),\n\n      // ImageLikeResource / VideoLikeResource\n      width: data.width ?? undefined,\n      height: data.height ?? undefined,\n      alt: data.alt,\n      zoomDisabled: data.zoomDisabled,\n\n      // VideoLikeResource\n      duration: data.duration,\n      mute: data.mute,\n      autoplay: data.autoplay,\n      allowSubtitles: data.allowSubtitles,\n      showSubtitles: data.showSubtitles,\n      posterImage,\n      thumbnails,\n\n      // WebsiteLinkResource\n      siteName: undefined, //data.siteName,\n\n      // Generic Resource\n      license: data.license,\n      copyright: data.copyright,\n      showInIndex: data.showInIndex,\n      search: data.search,\n      selected: data.selected,\n    });\n\n    return node;\n  }\n\n  /**\n   * Build resource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  /* private */ resource(\n    context: BuildContext,\n    data: {\n      type: ResourceTypeType;\n\n      // Generic part (value of bit tag)\n      value?: string; // url / src / href / app / body\n\n      // Alternative source\n      srcAlt?: string[];\n\n      // ImageLikeResource / AudioLikeResource / VideoLikeResource / Article / Document\n      format?: string;\n\n      // ImageLikeResource\n      src1x?: string;\n      src2x?: string;\n      src3x?: string;\n      src4x?: string;\n\n      // ImageLikeResource / VideoLikeResource\n      width?: string;\n      height?: string;\n      alt?: string;\n      zoomDisabled?: boolean;\n\n      // VideoLikeResource\n      duration?: number; // string?\n      mute?: boolean;\n      autoplay?: boolean;\n      allowSubtitles?: boolean;\n      showSubtitles?: boolean;\n      posterImage?: ImageResourceJson;\n      thumbnails?: ImageResourceJson[];\n\n      // WebsiteLinkResource\n      siteName?: string;\n\n      // Generic Resource\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n    //\n  ): ResourceJson | undefined {\n    let node: ResourceJson | undefined;\n\n    const { type, value: valueIn, format: formatIn, ...rest } = data;\n    const finalData = {\n      type,\n      value: valueIn ?? Breakscape.EMPTY_STRING,\n      format: formatIn ?? Breakscape.EMPTY_STRING,\n      ...rest,\n    };\n\n    // Special case for video like tags - build thumbnails from the srcXx properties\n    switch (type) {\n      case ResourceType.video:\n      case ResourceType.videoEmbed:\n      case ResourceType.videoLink:\n      case ResourceType.stillImageFilmEmbed:\n      case ResourceType.stillImageFilmLink: {\n        const thumbnailKeys = ['src1x', 'src2x', 'src3x', 'src4x'];\n        const thumbnails: ImageResourceJson[] = [];\n        for (const k of thumbnailKeys) {\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          const dataAsAny = data as any;\n          const value = dataAsAny[k];\n          if (value) {\n            const image: ImageResourceWrapperJson = this.resource(context, {\n              type: ResourceType.image,\n              value,\n            }) as ImageResourceWrapperJson;\n            if (image) thumbnails.push(image.image as ImageResourceJson);\n          }\n        }\n        // Merge with existing thumbnails\n        finalData.thumbnails = [...(finalData.thumbnails || []), ...thumbnails];\n      }\n    }\n\n    switch (type) {\n      case ResourceType.image:\n      case ResourceType.imagePortrait:\n      case ResourceType.imageLandscape:\n      case ResourceType.backgroundWallpaper:\n      case ResourceType.imagePlaceholder:\n      case ResourceType.icon:\n      case ResourceType.platformIcon:\n      case ResourceType.platformLogo:\n      case ResourceType.platformBackgroundImage:\n      case ResourceType.previewImage:\n      case ResourceType.coverImage:\n      case ResourceType.backgroundImage:\n        node = this.imageResource(context, finalData, type);\n        break;\n\n      // case ResourceType.imageResponsive: {\n      //   node = this.imageResponsiveResource({\n      //     imagePortrait: this.imageResource(\n      //       finalData.imagePortrait ?? {\n      //         format: '',\n      //         value: '',\n      //       },\n      //     ),\n      //     imageLandscape: this.imageResource(\n      //       finalData.imageLandscape ?? {\n      //         format: '',\n      //         value: '',\n      //       },\n      //     ),\n      //   });\n      //   break;\n      // }\n\n      case ResourceType.imageLink:\n        node = this.imageLinkResource(context, finalData);\n        break;\n\n      case ResourceType.audio:\n        node = this.audioResource(context, finalData);\n        break;\n\n      case ResourceType.audioEmbed:\n        node = this.audioEmbedResource(context, finalData);\n        break;\n\n      case ResourceType.audioLink:\n        node = this.audioLinkResource(context, finalData);\n        break;\n\n      case ResourceType.video:\n      case ResourceType.previewVideo:\n        node = this.videoResource(context, finalData);\n        break;\n\n      case ResourceType.videoEmbed:\n        node = this.videoEmbedResource(context, finalData);\n        break;\n\n      case ResourceType.videoLink:\n        node = this.videoLinkResource(context, finalData);\n        break;\n\n      // case ResourceType.stillImageFilm: {\n      //   node = this.stillImageFilmResource({\n      //     image: this.imageResource(context,\n      //       finalData.image ?? {\n      //         format: '',\n      //         value: '',\n      //       },\n      //     ),\n      //     audio: this.audioResource(context,\n      //       finalData.audio ?? {\n      //         format: '',\n      //         value: '',\n      //       },\n      //     ),\n      //   });\n      //   break;\n      // }\n\n      case ResourceType.stillImageFilmEmbed:\n        node = this.stillImageFilmEmbedResource(context, finalData);\n        break;\n\n      case ResourceType.stillImageFilmLink:\n        node = this.stillImageFilmLinkResource(context, finalData);\n        break;\n\n      case ResourceType.article:\n        node = this.articleResource(context, finalData);\n        break;\n\n      case ResourceType.document:\n        node = this.documentResource(context, finalData);\n        break;\n\n      case ResourceType.documentEmbed:\n        node = this.documentEmbedResource(context, finalData);\n        break;\n\n      case ResourceType.documentLink:\n        node = this.documentLinkResource(context, finalData);\n        break;\n\n      case ResourceType.documentDownload:\n        node = this.documentDownloadResource(context, finalData);\n        break;\n\n      case ResourceType.appLink:\n        node = this.appLinkResource(context, finalData);\n        break;\n\n      case ResourceType.websiteLink:\n        node = this.websiteLinkResource(context, finalData);\n        break;\n\n      default:\n    }\n\n    return node;\n  }\n\n  /**\n   * Build imageResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  imageResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string; //src\n      srcAlt?: string[];\n      src1x?: string;\n      src2x?: string;\n      src3x?: string;\n      src4x?: string;\n      width?: string | null;\n      height?: string | null;\n      alt?: string;\n      zoomDisabled?: boolean;\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n    __typeAlias?: ResourceTypeType,\n  ): ImageResourceWrapperJson | undefined {\n    const {\n      value,\n      srcAlt,\n      src1x,\n      src2x,\n      src3x,\n      src4x,\n      width,\n      height,\n      alt,\n      zoomDisabled,\n      license,\n      copyright,\n      showInIndex,\n      caption,\n      search,\n      selected,\n    } = data;\n    const { bitType } = context;\n    let zoomDisabledDefault = false;\n\n    if (\n      Config.isOfBitType(bitType, [\n        BitType.imageSeparator,\n        BitType.pageBanner,\n        BitType.imagesLogoGrave,\n        BitType.prototypeImages,\n        BitType.extractorImage,\n      ])\n    ) {\n      zoomDisabledDefault = true;\n    }\n\n    // NOTE: Node order is important and is defined here\n    const node: ImageResourceWrapperJson = {\n      type: ResourceType.image,\n      __typeAlias: __typeAlias ?? ResourceType.image,\n      __configKey: resourceTypeToConfigKey(__typeAlias ?? ResourceType.image),\n      image: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        src: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        src1x: (src1x ?? undefined) as string,\n        src2x: (src2x ?? undefined) as string,\n        src3x: (src3x ?? undefined) as string,\n        src4x: (src4x ?? undefined) as string,\n        width: (width ?? null) as string,\n        height: (height ?? null) as string,\n        alt: alt ?? '',\n        zoomDisabled: zoomDisabled ?? zoomDisabledDefault,\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.image, {\n      ignoreFalse: ['zoomDisabled', 'showInIndex', 'selected'],\n      ignoreEmptyArrays: ['caption'],\n      ignoreUndefined: ['width', 'height'],\n      ignoreEmptyString: ['src', 'alt', 'license', 'copyright'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build imageLinkResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  imageLinkResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string;\n      srcAlt?: string[];\n      src1x?: string;\n      src2x?: string;\n      src3x?: string;\n      src4x?: string;\n      width?: string;\n      height?: string;\n      alt?: string;\n      zoomDisabled?: boolean;\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): ImageLinkResourceWrapperJson | undefined {\n    const {\n      value,\n      srcAlt,\n      src1x,\n      src2x,\n      src3x,\n      src4x,\n      width,\n      height,\n      alt,\n      zoomDisabled,\n      license,\n      copyright,\n      showInIndex,\n      caption,\n      search,\n      selected,\n    } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: ImageLinkResourceWrapperJson = {\n      type: ResourceType.imageLink,\n      __typeAlias: ResourceType.imageLink,\n      __configKey: resourceTypeToConfigKey(ResourceType.imageLink),\n      imageLink: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        // src: value ?? '',\n        url: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        src1x: (src1x ?? undefined) as string,\n        src2x: (src2x ?? undefined) as string,\n        src3x: (src3x ?? undefined) as string,\n        src4x: (src4x ?? undefined) as string,\n        width: (width ?? null) as string,\n        height: (height ?? null) as string,\n        alt: alt ?? '',\n        zoomDisabled: zoomDisabled ?? false, // TODO: Default depends on the bit(!)\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.imageLink, {\n      ignoreFalse: ['zoomDisabled', 'showInIndex', 'selected'],\n      ignoreEmptyArrays: ['caption'],\n      ignoreUndefined: ['width', 'height'],\n      ignoreEmptyString: ['url', 'alt', 'license', 'copyright'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build audioResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  audioResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string; // src\n      srcAlt?: string[];\n      duration?: number; // string?\n      mute?: boolean;\n      autoplay?: boolean;\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): AudioResourceWrapperJson | undefined {\n    const {\n      value,\n      srcAlt,\n      duration,\n      mute,\n      autoplay,\n      license,\n      copyright,\n      showInIndex,\n      caption,\n      search,\n      selected,\n    } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: AudioResourceWrapperJson = {\n      type: ResourceType.audio,\n      __typeAlias: ResourceType.audio,\n      __configKey: resourceTypeToConfigKey(ResourceType.audio),\n      audio: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        src: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        duration: (duration ?? undefined) as number,\n        mute: (mute ?? undefined) as boolean,\n        autoplay: (autoplay ?? undefined) as boolean,\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.audio, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreEmptyString: ['src', 'alt', 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build audioEmbedResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  audioEmbedResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string; // src\n      srcAlt?: string[];\n      duration?: number; // string?\n      mute?: boolean;\n      autoplay?: boolean;\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): AudioEmbedResourceWrapperJson | undefined {\n    const {\n      value,\n      srcAlt,\n      duration,\n      mute,\n      autoplay,\n      license,\n      copyright,\n      showInIndex,\n      caption,\n      search,\n      selected,\n    } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: AudioEmbedResourceWrapperJson = {\n      type: ResourceType.audioEmbed,\n      __typeAlias: ResourceType.audioEmbed,\n      __configKey: resourceTypeToConfigKey(ResourceType.audioEmbed),\n      audioEmbed: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        src: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        duration: (duration ?? undefined) as number,\n        mute: (mute ?? undefined) as boolean,\n        autoplay: (autoplay ?? undefined) as boolean,\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.audioEmbed, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreEmptyString: ['src', /*'alt',*/ 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build audioLinkResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  audioLinkResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string;\n      srcAlt?: string[];\n      duration?: number; // string?\n      mute?: boolean;\n      autoplay?: boolean;\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): AudioLinkResourceWrapperJson | undefined {\n    const {\n      value,\n      srcAlt,\n      duration,\n      mute,\n      autoplay,\n      license,\n      copyright,\n      showInIndex,\n      caption,\n      search,\n      selected,\n    } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: AudioLinkResourceWrapperJson = {\n      type: ResourceType.audioLink,\n      __typeAlias: ResourceType.audioLink,\n      __configKey: resourceTypeToConfigKey(ResourceType.audioLink),\n      audioLink: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        // src: value ?? '',\n        url: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        duration: (duration ?? undefined) as number,\n        mute: (mute ?? undefined) as boolean,\n        autoplay: (autoplay ?? undefined) as boolean,\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.audioLink, {\n      // ignoreEmptyArrays: ['caption'],\n      ignoreEmptyString: ['url' /*'alt', 'license', 'copyright'*/],\n      ignoreFalse: ['selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build videoResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  videoResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string; // src\n      srcAlt?: string[];\n      width?: string;\n      height?: string;\n      duration?: number; // string?\n      mute?: boolean;\n      autoplay?: boolean;\n      allowSubtitles?: boolean;\n      showSubtitles?: boolean;\n      alt?: string;\n      posterImage?: ImageResourceJson;\n      thumbnails?: ImageResourceJson[];\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): VideoResourceWrapperJson | undefined {\n    const {\n      value,\n      srcAlt,\n      width,\n      height,\n      duration,\n      mute,\n      autoplay,\n      allowSubtitles,\n      showSubtitles,\n      alt,\n      posterImage,\n      thumbnails,\n      license,\n      copyright,\n      showInIndex,\n      caption,\n      search,\n      selected,\n    } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: VideoResourceWrapperJson = {\n      type: ResourceType.video,\n      __typeAlias: ResourceType.video,\n      __configKey: resourceTypeToConfigKey(ResourceType.video),\n      video: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        src: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        width: (width ?? null) as string,\n        height: (height ?? null) as string,\n        duration: (duration ?? undefined) as number,\n        mute: (mute ?? undefined) as boolean,\n        autoplay: (autoplay ?? undefined) as boolean,\n        allowSubtitles: (allowSubtitles ?? undefined) as boolean,\n        showSubtitles: (showSubtitles ?? undefined) as boolean,\n        alt: alt ?? '',\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n        // Have sub-chains so must be at end of chain\n        posterImage: (posterImage ?? undefined) as ImageResourceJson,\n        thumbnails: (thumbnails ?? undefined) as ImageResourceJson[],\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.video, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreUndefined: ['width', 'height'],\n      ignoreEmptyString: ['src', /*'alt',*/ 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build videoEmbedResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  videoEmbedResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string; // src\n      srcAlt?: string[];\n      width?: string;\n      height?: string;\n      duration?: number; // string?\n      mute?: boolean;\n      autoplay?: boolean;\n      allowSubtitles?: boolean;\n      showSubtitles?: boolean;\n      alt?: string;\n      posterImage?: ImageResourceJson;\n      thumbnails?: ImageResourceJson[];\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): VideoEmbedResourceWrapperJson | undefined {\n    const {\n      value,\n      srcAlt,\n      width,\n      height,\n      duration,\n      mute,\n      autoplay,\n      allowSubtitles,\n      showSubtitles,\n      alt,\n      posterImage,\n      thumbnails,\n      license,\n      copyright,\n      showInIndex,\n      caption,\n      search,\n      selected,\n    } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: VideoEmbedResourceWrapperJson = {\n      type: ResourceType.videoEmbed,\n      __typeAlias: ResourceType.videoEmbed,\n      __configKey: resourceTypeToConfigKey(ResourceType.videoEmbed),\n      videoEmbed: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        // src: value ?? '',\n        url: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        width: (width ?? null) as string,\n        height: (height ?? null) as string,\n        duration: (duration ?? undefined) as number,\n        mute: (mute ?? undefined) as boolean,\n        autoplay: (autoplay ?? undefined) as boolean,\n        allowSubtitles: (allowSubtitles ?? undefined) as boolean,\n        showSubtitles: (showSubtitles ?? undefined) as boolean,\n        alt: alt ?? '',\n        posterImage: (posterImage ?? undefined) as ImageResourceJson,\n        thumbnails: (thumbnails ?? undefined) as ImageResourceJson[],\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.videoEmbed, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreUndefined: ['width', 'height'],\n      ignoreEmptyString: ['url', /*'alt',*/ 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build videoLinkResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  videoLinkResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string;\n      srcAlt?: string[];\n      width?: string;\n      height?: string;\n      duration?: number; // string?\n      mute?: boolean;\n      autoplay?: boolean;\n      allowSubtitles?: boolean;\n      showSubtitles?: boolean;\n      alt?: string;\n      posterImage?: ImageResourceJson;\n      thumbnails?: ImageResourceJson[];\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): VideoLinkResourceWrapperJson | undefined {\n    const {\n      value,\n      srcAlt,\n      width,\n      height,\n      duration,\n      mute,\n      autoplay,\n      allowSubtitles,\n      showSubtitles,\n      alt,\n      posterImage,\n      thumbnails,\n      license,\n      copyright,\n      showInIndex,\n      caption,\n      search,\n      selected,\n    } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: VideoLinkResourceWrapperJson = {\n      type: ResourceType.videoLink,\n      __typeAlias: ResourceType.videoLink,\n      __configKey: resourceTypeToConfigKey(ResourceType.videoLink),\n      videoLink: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        // src: value ?? '',\n        url: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        width: (width ?? null) as string,\n        height: (height ?? null) as string,\n        duration: (duration ?? undefined) as number,\n        mute: (mute ?? undefined) as boolean,\n        autoplay: (autoplay ?? undefined) as boolean,\n        allowSubtitles: (allowSubtitles ?? undefined) as boolean,\n        showSubtitles: (showSubtitles ?? undefined) as boolean,\n        alt: alt ?? '',\n        posterImage: (posterImage ?? undefined) as ImageResourceJson,\n        thumbnails: (thumbnails ?? undefined) as ImageResourceJson[],\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.videoLink, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreUndefined: ['width', 'height'],\n      ignoreEmptyString: ['url', /*'alt',*/ 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  // /**\n  //  * Build stillImageFilmResource node\n  //  *\n  //  * @param data - data for the node\n  //  * @returns\n  //  */\n  // stillImageFilmResource(context: BuildContext, data: { image?: ImageResource; audio?: AudioResource }): StillImageFilmResource {\n  //   const { image, audio } = data;\n\n  //   // NOTE: Node order is important and is defined here\n  //   const node: StillImageFilmResource = {\n  //     type: ResourceType.stillImageFilm,\n  //     __typeAlias: ResourceType.stillImageFilm,\n  //     image: image ?? this.imageResource({ format: '', value: '' }),\n  //     audio: audio ?? this.audioResource({ format: '', value: '' }),\n  //   };\n\n  //   // Remove Unset Optionals\n  //   ObjectUtils.removeUnwantedProperties(node);\n\n  //   // Validate and correct invalid bits as much as possible\n  //   return NodeValidator.validateResource(node) ;\n  // }\n\n  /**\n   * Build stillImageFilmEmbedResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  stillImageFilmEmbedResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string; // src\n      srcAlt?: string[];\n      width?: string;\n      height?: string;\n      duration?: number; // string?\n      mute?: boolean;\n      autoplay?: boolean;\n      allowSubtitles?: boolean;\n      showSubtitles?: boolean;\n      alt?: string;\n      posterImage?: ImageResourceJson;\n      thumbnails?: ImageResourceJson[];\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): StillImageFilmEmbedResourceWrapperJson | undefined {\n    const {\n      value,\n      srcAlt,\n      width,\n      height,\n      duration,\n      mute,\n      autoplay,\n      allowSubtitles,\n      showSubtitles,\n      alt,\n      posterImage,\n      thumbnails,\n      license,\n      copyright,\n      showInIndex,\n      caption,\n      search,\n      selected,\n    } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: StillImageFilmEmbedResourceWrapperJson = {\n      type: ResourceType.stillImageFilmEmbed,\n      __typeAlias: ResourceType.stillImageFilmEmbed,\n      __configKey: resourceTypeToConfigKey(ResourceType.stillImageFilmEmbed),\n      stillImageFilmEmbed: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        // src: value ?? '',\n        url: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        width: (width ?? null) as string,\n        height: (height ?? null) as string,\n        duration: (duration ?? undefined) as number,\n        mute: (mute ?? undefined) as boolean,\n        autoplay: (autoplay ?? undefined) as boolean,\n        allowSubtitles: (allowSubtitles ?? undefined) as boolean,\n        showSubtitles: (showSubtitles ?? undefined) as boolean,\n        alt: alt ?? '',\n        posterImage: (posterImage ?? undefined) as ImageResourceJson,\n        thumbnails: (thumbnails ?? undefined) as ImageResourceJson[],\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.stillImageFilmEmbed, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreUndefined: ['width', 'height'],\n      ignoreEmptyString: ['url', /*'alt',*/ 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build stillImageFilmLinkResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  stillImageFilmLinkResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string;\n      srcAlt?: string[];\n      width?: string;\n      height?: string;\n      duration?: number; // string?\n      mute?: boolean;\n      autoplay?: boolean;\n      allowSubtitles?: boolean;\n      showSubtitles?: boolean;\n      alt?: string;\n      posterImage?: ImageResourceJson;\n      thumbnails?: ImageResourceJson[];\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): StillImageFilmLinkResourceWrapperJson | undefined {\n    const {\n      value,\n      srcAlt,\n      width,\n      height,\n      duration,\n      mute,\n      autoplay,\n      allowSubtitles,\n      showSubtitles,\n      alt,\n      posterImage,\n      thumbnails,\n      license,\n      copyright,\n      showInIndex,\n      caption,\n      search,\n      selected,\n    } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: StillImageFilmLinkResourceWrapperJson = {\n      type: ResourceType.stillImageFilmLink,\n      __typeAlias: ResourceType.stillImageFilmLink,\n      __configKey: resourceTypeToConfigKey(ResourceType.stillImageFilmLink),\n      stillImageFilmLink: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        // src: value ?? '',\n        url: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        width: (width ?? null) as string,\n        height: (height ?? null) as string,\n        duration: (duration ?? undefined) as number,\n        mute: (mute ?? undefined) as boolean,\n        autoplay: (autoplay ?? undefined) as boolean,\n        allowSubtitles: (allowSubtitles ?? undefined) as boolean,\n        showSubtitles: (showSubtitles ?? undefined) as boolean,\n        alt: alt ?? '',\n        posterImage: (posterImage ?? undefined) as ImageResourceJson,\n        thumbnails: (thumbnails ?? undefined) as ImageResourceJson[],\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.stillImageFilmLink, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreUndefined: ['width', 'height'],\n      ignoreEmptyString: ['url', /*'alt',*/ 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build articleResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  articleResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      srcAlt?: string[];\n      value: string;\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): ArticleResourceWrapperJson | undefined {\n    const { value, srcAlt, license, copyright, showInIndex, caption, search, selected } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: ArticleResourceWrapperJson = {\n      type: ResourceType.article,\n      __typeAlias: ResourceType.article,\n      __configKey: resourceTypeToConfigKey(ResourceType.article),\n      article: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        body: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.article, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreEmptyString: ['body', 'alt', 'license', 'copyright'],\n      ignoreFalse: ['selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build documentResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  documentResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string;\n      srcAlt?: string[];\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): DocumentResourceWrapperJson | undefined {\n    const { value, srcAlt, license, copyright, showInIndex, caption, search, selected } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: DocumentResourceWrapperJson = {\n      type: ResourceType.document,\n      __typeAlias: ResourceType.document,\n      __configKey: resourceTypeToConfigKey(ResourceType.document),\n      document: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        url: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.document, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreEmptyString: ['url', 'alt', 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build documentEmbedResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  documentEmbedResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string;\n      srcAlt?: string[];\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): DocumentEmbedResourceWrapperJson | undefined {\n    const { value, srcAlt, license, copyright, showInIndex, caption, search, selected } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: DocumentEmbedResourceWrapperJson = {\n      type: ResourceType.documentEmbed,\n      __typeAlias: ResourceType.documentEmbed,\n      __configKey: resourceTypeToConfigKey(ResourceType.documentEmbed),\n      documentEmbed: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        url: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.documentEmbed, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreEmptyString: ['url', 'alt', 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build documentLinkResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  documentLinkResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string;\n      srcAlt?: string[];\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): DocumentLinkResourceWrapperJson | undefined {\n    const { value, srcAlt, license, copyright, showInIndex, caption, search, selected } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: DocumentLinkResourceWrapperJson = {\n      type: ResourceType.documentLink,\n      __typeAlias: ResourceType.documentLink,\n      __configKey: resourceTypeToConfigKey(ResourceType.documentLink),\n      documentLink: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        url: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.documentLink, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreEmptyString: ['url', 'alt', 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build documentDownloadResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  documentDownloadResource(\n    context: BuildContext,\n    data: {\n      format: string;\n      value: string;\n      srcAlt?: string[];\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): DocumentDownloadResourceWrapperJson | undefined {\n    const { value, srcAlt, license, copyright, showInIndex, caption, search, selected } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: DocumentDownloadResourceWrapperJson = {\n      type: ResourceType.documentDownload,\n      __typeAlias: ResourceType.documentDownload,\n      __configKey: resourceTypeToConfigKey(ResourceType.documentDownload),\n      documentDownload: {\n        format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        url: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.documentDownload, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreEmptyString: ['url', 'alt', 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build appLinkResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  appLinkResource(\n    context: BuildContext,\n    data: {\n      value: string;\n      srcAlt?: string[];\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): AppLinkResourceWrapperJson | undefined {\n    const { value, srcAlt, license, copyright, showInIndex, caption, search, selected } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: AppLinkResourceWrapperJson = {\n      type: ResourceType.appLink,\n      __typeAlias: ResourceType.appLink,\n      __configKey: resourceTypeToConfigKey(ResourceType.appLink),\n      appLink: {\n        // format: (UrlUtils.fileExtensionFromUrl(value) ?? undefined) as string,\n        // provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        provider: undefined as unknown as string,\n        url: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.appLink, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreEmptyString: ['url', /*'alt',*/ 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  /**\n   * Build websiteLinkResource node\n   *\n   * @param data - data for the node\n   * @returns\n   */\n  websiteLinkResource(\n    context: BuildContext,\n    data: {\n      value: string;\n      srcAlt?: string[];\n      siteName?: string;\n      license?: string;\n      copyright?: string;\n      showInIndex?: boolean;\n      caption?: TextAst;\n      search?: string;\n      selected?: boolean;\n    },\n  ): WebsiteLinkResourceWrapperJson | undefined {\n    const {\n      value,\n      srcAlt,\n      /*siteName,*/ license,\n      copyright,\n      showInIndex,\n      caption,\n      search,\n      selected,\n    } = data;\n\n    // NOTE: Node order is important and is defined here\n    const node: WebsiteLinkResourceWrapperJson = {\n      type: ResourceType.websiteLink,\n      __typeAlias: ResourceType.websiteLink,\n      __configKey: resourceTypeToConfigKey(ResourceType.websiteLink),\n      websiteLink: {\n        // provider: (UrlUtils.domainFromUrl(value) ?? undefined) as string,\n        provider: undefined as unknown as string,\n        url: value ?? '',\n        srcAlt: (srcAlt ?? undefined) as string[],\n        // siteName,\n        license: license ?? '',\n        copyright: copyright ?? '',\n        showInIndex: showInIndex ?? false,\n        caption: this.handleJsonText(context, TextLocation.tag, caption),\n        search: (search ?? undefined) as string,\n        selected: selected ?? false,\n      },\n    };\n\n    // Remove Unset Optionals\n    ObjectUtils.removeUnwantedProperties(node.websiteLink, {\n      ignoreEmptyArrays: ['caption'],\n      ignoreEmptyString: ['url', 'alt', 'license', 'copyright'],\n      ignoreFalse: ['showInIndex', 'selected'],\n    });\n\n    // Validate and correct invalid bits as much as possible\n    return NodeValidator.validateResource(node);\n  }\n\n  //\n  //\n  //\n\n  //\n  // Private\n  //\n}\n\nexport { ResourceBuilder };\n","class UrlUtils {\n  fileExtensionFromUrl(url: string | undefined): string | undefined {\n    let format: string | undefined;\n\n    if (url) {\n      try {\n        const parsedUrl = new URL(url);\n        const pathParts = parsedUrl.pathname.split('.');\n        if (pathParts.length > 1) {\n          format = pathParts[pathParts.length - 1];\n        }\n      } catch (_e) {\n        // will return undefined\n      }\n    }\n\n    return format;\n  }\n\n  domainFromUrl(url: string | undefined): string | undefined {\n    let domain: string | undefined;\n\n    if (url) {\n      try {\n        const parsedUrl = new URL(url);\n        domain = parsedUrl.hostname;\n      } catch (_e) {\n        // will return undefined\n      }\n    }\n\n    return domain;\n  }\n}\n\nconst instance = new UrlUtils();\n\nexport { instance as UrlUtils };\n","import { type Bit, type CardBit } from '../../model/ast/Nodes.ts';\nimport { ResourceType } from '../../model/enum/ResourceType.ts';\nimport {\n  type AppLinkResourceWrapperJson,\n  type ArticleResourceWrapperJson,\n  type AudioEmbedResourceWrapperJson,\n  type AudioLinkResourceWrapperJson,\n  type AudioResourceWrapperJson,\n  type DocumentDownloadResourceWrapperJson,\n  type DocumentEmbedResourceWrapperJson,\n  type DocumentLinkResourceWrapperJson,\n  type DocumentResourceWrapperJson,\n  type ImageLinkResourceWrapperJson,\n  type ImageResourceWrapperJson,\n  type ResourceJson,\n  type StillImageFilmEmbedResourceWrapperJson,\n  type StillImageFilmLinkResourceWrapperJson,\n  type StillImageFilmResourceWrapperJson,\n  type VideoEmbedResourceWrapperJson,\n  type VideoLinkResourceWrapperJson,\n  type VideoResourceWrapperJson,\n  type WebsiteLinkResourceWrapperJson,\n} from '../../model/json/ResourceJson.ts';\nimport { StringUtils } from '../../utils/StringUtils.ts';\n\n/**\n * Validates a node as the builder level (i.e. when creating AST).\n *\n * This is not really implemented yet.\n * Validation happens in the bitmark parsing, but not when creating the AST.\n * This means that the JSON => bitmark conversion is not well validated yet.\n */\nclass NodeValidator {\n  validateBit(bit: Bit | undefined): Bit | undefined {\n    if (!bit) return bit;\n\n    // TODO\n    const ret: Bit | undefined = bit;\n    // switch (bit.bitType.root) {\n    //   case BitType.interview:\n    //     ret = this.validateInterviewBit(bit);\n    //     break;\n    // }\n\n    return ret;\n  }\n\n  validateCardBit(bit: CardBit | undefined): CardBit | undefined {\n    if (!bit) return bit;\n\n    const ret: CardBit | undefined = bit;\n    // TODO\n\n    return ret;\n  }\n\n  validateResource<T extends ResourceJson>(resource: T | undefined): T | undefined {\n    if (!resource) return undefined;\n\n    const ret: T | undefined = resource;\n    let valid = true;\n\n    switch (resource.type) {\n      case ResourceType.image: {\n        // case ResourceTag.imagePortrait:\n        // case ResourceTag.imageLandscape:\n        const imageResource = (resource as ImageResourceWrapperJson).image;\n        if (!StringUtils.isString(imageResource.src)) imageResource.src = '';\n        break;\n      }\n      case ResourceType.imageLink: {\n        const imageLink = (resource as ImageLinkResourceWrapperJson).imageLink;\n        if (!StringUtils.isString(imageLink.url)) imageLink.url = '';\n        break;\n      }\n      case ResourceType.audio: {\n        const audio = (resource as AudioResourceWrapperJson).audio;\n        if (!StringUtils.isString(audio.src)) audio.src = '';\n        break;\n      }\n      case ResourceType.audioEmbed: {\n        const audioEmbed = (resource as AudioEmbedResourceWrapperJson).audioEmbed;\n        if (!StringUtils.isString(audioEmbed.src)) audioEmbed.src = '';\n        break;\n      }\n      case ResourceType.audioLink: {\n        const audioLink = (resource as AudioLinkResourceWrapperJson).audioLink;\n        if (!StringUtils.isString(audioLink.url)) audioLink.url = '';\n        break;\n      }\n      case ResourceType.video: {\n        const video = (resource as VideoResourceWrapperJson).video;\n        if (!StringUtils.isString(video.src)) video.src = '';\n        break;\n      }\n      case ResourceType.videoEmbed: {\n        const videoEmbed = (resource as VideoEmbedResourceWrapperJson).videoEmbed;\n        if (!StringUtils.isString(videoEmbed.url)) videoEmbed.url = '';\n        break;\n      }\n      case ResourceType.videoLink: {\n        const videoLink = (resource as VideoLinkResourceWrapperJson).videoLink;\n        if (!StringUtils.isString(videoLink.url)) videoLink.url = '';\n        break;\n      }\n      case ResourceType.stillImageFilm: {\n        const stillImageFilm = resource as StillImageFilmResourceWrapperJson;\n        if (!StringUtils.isString(stillImageFilm.image.src)) stillImageFilm.image.src = '';\n        if (!StringUtils.isString(stillImageFilm.audio.src)) stillImageFilm.audio.src = '';\n        break;\n      }\n      case ResourceType.stillImageFilmEmbed: {\n        const stillImageFilmEmbed = (resource as StillImageFilmEmbedResourceWrapperJson)\n          .stillImageFilmEmbed;\n        if (!StringUtils.isString(stillImageFilmEmbed.url)) stillImageFilmEmbed.url = '';\n        break;\n      }\n      case ResourceType.stillImageFilmLink: {\n        const stillImageFilmLink = (resource as StillImageFilmLinkResourceWrapperJson)\n          .stillImageFilmLink;\n        if (!StringUtils.isString(stillImageFilmLink.url)) stillImageFilmLink.url = '';\n        break;\n      }\n      case ResourceType.article: {\n        const article = (resource as ArticleResourceWrapperJson).article;\n        if (!StringUtils.isString(article.body)) article.body = '';\n        break;\n      }\n      case ResourceType.document: {\n        const document = (resource as DocumentResourceWrapperJson).document;\n        if (!StringUtils.isString(document.url)) document.url = '';\n        break;\n      }\n      case ResourceType.documentEmbed: {\n        const documentEmbed = (resource as DocumentEmbedResourceWrapperJson).documentEmbed;\n        if (!StringUtils.isString(documentEmbed.url)) documentEmbed.url = '';\n        break;\n      }\n      case ResourceType.documentLink: {\n        const documentLink = (resource as DocumentLinkResourceWrapperJson).documentLink;\n        if (!StringUtils.isString(documentLink.url)) documentLink.url = '';\n        break;\n      }\n      case ResourceType.documentDownload: {\n        const documentDownload = (resource as DocumentDownloadResourceWrapperJson).documentDownload;\n        if (!StringUtils.isString(documentDownload.url)) documentDownload.url = '';\n        break;\n      }\n      case ResourceType.appLink: {\n        const appLink = (resource as AppLinkResourceWrapperJson).appLink;\n        if (!StringUtils.isString(appLink.url)) appLink.url = '';\n        break;\n      }\n      case ResourceType.websiteLink: {\n        const websiteLink = (resource as WebsiteLinkResourceWrapperJson).websiteLink;\n        if (!StringUtils.isString(websiteLink.url)) websiteLink.url = '';\n        break;\n      }\n\n      default:\n        valid = false;\n    }\n\n    // Note: even if resource is invalid, we still return it as it is used to set the resource attachment type\n    // in the bit declaration, and if it is removed completely this cannot be done.\n    if (!valid) {\n      if (resource.type) {\n        resource.__invalid = true;\n      }\n    }\n\n    return ret;\n  }\n\n  isRequired(val: unknown, name: string) {\n    if (val) return;\n    throw new Error(`${name} is required but is not set`);\n  }\n\n  isOneOfRequired(vals: unknown[], names: string[]) {\n    if (Array.isArray(vals)) {\n      for (const v of vals) {\n        if (v) return;\n      }\n    }\n\n    throw new Error(`One of '${names.join(', ')}' is required but none is set`);\n  }\n\n  isString(val: unknown, name: string) {\n    if (StringUtils.isString(val)) return;\n    throw new Error(`${name} is required to be a string`);\n  }\n\n  isNonEmptyString(val: unknown, name: string) {\n    if (StringUtils.isString(val) && val !== '') return;\n    throw new Error(`${name} is required to be a non-empty string`);\n  }\n\n  isStringOrBoolean(val: unknown, name: string) {\n    if (StringUtils.isString(val)) return;\n    if (val === true || val === false) return;\n    throw new Error(`${name} is required to be a string or a boolean`);\n  }\n\n  isNonEmptyStringOrBoolean(val: unknown, name: string) {\n    if (StringUtils.isString(val) && val !== '') return;\n    if (val === true || val === false) return;\n    throw new Error(`${name} is required to be a non-empty string or a boolean`);\n  }\n\n  isArray(val: unknown, name: string) {\n    if (Array.isArray(val)) return;\n    throw new Error(`${name} is required to be a array`);\n  }\n\n  isNonEmptyArray(val: unknown, name: string) {\n    if (Array.isArray(val) && val.length > 0) return;\n    throw new Error(`${name} is required to be a non-empty array`);\n  }\n\n  isNumber(val: unknown, name: string) {\n    if (Number.isFinite(val)) return;\n    throw new Error(`${name} is required to be a number`);\n  }\n\n  isBoolean(val: unknown, name: string) {\n    if (val === true || val === false) return;\n    throw new Error(`${name} is required to be a boolean`);\n  }\n\n  isStringOrNumberOrBooleanOrNullOrUndefined(val: unknown, name: string) {\n    if (StringUtils.isString(val)) return;\n    if (Number.isFinite(val)) return;\n    if (val === true || val === false) return;\n    if (val == null) return;\n    throw new Error(\n      `${name} is required to be a string or a number or a boolean or null or undefined`,\n    );\n  }\n\n  //\n  // private\n  //\n\n  // private validateInterviewBit(bit: Bit): Bit | undefined {\n  //   // Ensure bit has a questions array as the\n  //   // ===\n  //   // ===\n  //   // must be included in the markup\n  //   if (!bit.cardNode) {\n  //     bit.cardNode = {};\n  //   }\n\n  //   if (!bit.cardNode.questions) {\n  //     bit.cardNode.questions = [];\n  //   }\n\n  //   return bit;\n  // }\n}\n\nconst nodeValidator = new NodeValidator();\n\nexport { nodeValidator as NodeValidator };\n","import { type Writer } from './Writer.ts';\n\n/**\n * Writer to write to a string.\n */\nclass StringWriter implements Writer {\n  private _buffer: string[] | undefined;\n  private _string: string = '';\n  public endOfLineString = '\\n';\n  private lastWrite = '';\n\n  public get isSync() {\n    return true;\n  }\n\n  /**\n   * Get the string which has been written.\n   *\n   * This cannot be called until after close() has resolved its Promise.\n   *\n   * @returns\n   */\n  public getString(): string {\n    return this._string;\n  }\n\n  public async open(): Promise<void> {\n    this.openSync();\n    return Promise.resolve();\n  }\n\n  public async close(): Promise<void> {\n    try {\n      this.closeSync();\n    } catch (e) {\n      return Promise.reject(e);\n    }\n    return Promise.resolve();\n  }\n\n  public openSync(): void {\n    this._buffer = [];\n    this._string = '';\n  }\n\n  public closeSync(): void {\n    if (!this._buffer) {\n      throw new Error('open() or openSync() never called');\n    }\n    this._string = this._buffer.join('');\n    this._buffer = [];\n  }\n\n  public writeLine(value?: string): this {\n    if (!this._buffer) return this;\n\n    let line: string;\n\n    if (value != null) {\n      line = value + this.endOfLineString;\n    } else {\n      line = this.endOfLineString;\n    }\n\n    this._buffer.push(line);\n    this.lastWrite = line;\n\n    return this;\n  }\n\n  public writeLines(values: string[], delimiter?: string): this {\n    if (!this._buffer) return this;\n    if (!values) return this;\n    let str = '';\n\n    for (let i = 0, len = values.length; i < len; i++) {\n      const value = values[i];\n      this._buffer.push(value);\n      str += value;\n      if (delimiter && i < len - 1) {\n        this._buffer.push(delimiter);\n        str += delimiter;\n      }\n      this._buffer.push(this.endOfLineString);\n      str += this.endOfLineString;\n    }\n\n    this.lastWrite = str;\n\n    return this;\n  }\n\n  public write(value: string): this {\n    if (!this._buffer) return this;\n    if (value == null) return this;\n    if (value) this.lastWrite = value;\n    this._buffer.push(value);\n    return this;\n  }\n\n  public writeWhiteSpace(): this {\n    this.write(' ');\n    return this;\n  }\n\n  public getLastWrite(): string {\n    return this.lastWrite;\n  }\n}\n\nexport { StringWriter };\n","import { Enum, type EnumType } from '@ncoderz/superenum';\n\nimport { Ast } from './ast/Ast.ts';\nimport { Config } from './config/Config.ts';\nimport { type BitmarkOptions } from './generator/bitmark/BitmarkGenerator.ts';\nimport { BitmarkStringGenerator } from './generator/bitmark/BitmarkStringGenerator.ts';\nimport { HtmlTableGenerator } from './generator/html/HtmlTableGenerator.ts';\nimport { type JsonOptions } from './generator/json/JsonGenerator.ts';\nimport { JsonObjectGenerator } from './generator/json/JsonObjectGenerator.ts';\n// import { TextFormat, TextFormatType } from './model/enum/TextFormat.ts';\nimport { TextGenerator } from './generator/text/TextGenerator.ts';\nimport { InfoBuilder, type SupportedBit } from './info/InfoBuilder.ts';\nimport { type BitmarkAst } from './model/ast/Nodes.ts';\nimport { BitmarkParserType, type BitmarkParserTypeType } from './model/enum/BitmarkParserType.ts';\nimport { BitmarkVersion, type BitmarkVersionType } from './model/enum/BitmarkVersion.ts';\nimport { InfoFormat, type InfoFormatType } from './model/info/enum/InfoFormat.ts';\nimport { InfoType, type InfoTypeType } from './model/info/enum/InfoType.ts';\nimport { BitmarkParser } from './parser/bitmark/BitmarkParser.ts';\nimport { type HtmlTableFormat, HtmlTableParser } from './parser/html/HtmlTableParser.ts';\nimport { JsonParser } from './parser/json/JsonParser.ts';\nimport { TextParser } from './parser/text/TextParser.ts';\nimport { env } from './utils/env/Env.ts';\n\n/*\n * NOTE:\n *\n * We want to be able to strip out the NodeJS specific functions from the final bundle.\n * Any code between the comments STRIP:START and STRIP:END will be removed.\n *\n * However, the prettifier will move comments that it does not believe are associated with code.\n *\n * Therefore we have to use some dummy code to prevent it from removing the STRIP stripping comments.\n *\n * IMPORTANT: Only NodeJS-specific imports belong in this block. A browser-safe module that is used\n * by browser-facing code (e.g. HtmlTableGenerator / HtmlTableParser, used by convertHtmlTable) must\n * be imported OUTSIDE this block. If such an import is stripped from the browser build, its\n * references become dangling globals (ReferenceError) once the bundle is minified.\n */\nconst STRIP = 0;\n\n/* STRIP:START */\nSTRIP; // eslint-disable-line @typescript-eslint/no-unused-expressions\n\nimport path from 'node:path';\n\nimport fs from 'fs-extra';\n\nimport { type FileOptions } from './ast/writer/FileWriter.ts';\nimport { Breakscape } from './breakscaping/Breakscape.ts';\nimport { BitmarkFileGenerator } from './generator/bitmark/BitmarkFileGenerator.ts';\nimport { JsonFileGenerator } from './generator/json/JsonFileGenerator.ts';\nimport { PlainTextGenerator } from './generator/plainText/PlainTextGenerator.ts';\nimport { BitType, type BitWrapperJson, type TextAst } from './index.ts';\nimport { ConfigBuilder } from './info/ConfigBuilder.ts';\nimport { type BreakscapedString } from './model/ast/BreakscapedString.ts';\nimport type { _BitConfig, _GroupsConfig } from './model/config/_Config.ts';\nimport { type BodyTextFormatType } from './model/enum/BodyTextFormat.ts';\nimport { TextFormat, type TextFormatType } from './model/enum/TextFormat.ts';\nimport { TextLocation, type TextLocationType } from './model/enum/TextLocation.ts';\n\n/* STRIP:END */\nSTRIP; // eslint-disable-line @typescript-eslint/no-unused-expressions\n\n/**\n * Info options for the parser\n */\nexport interface InfoOptions {\n  /**\n   * Specify the type of information to return, overriding the default (list)\n   * - list: list of supported bits\n   * - deprecated: list of deprecated bits\n   * - all: list of supported bits and deprecated bits\n   * - bit: configuration for a specific bit, or all bits\n   */\n  type?: InfoTypeType;\n\n  /**\n   * Specify the bit type to return, overriding the default (all)\n   */\n  bit?: string;\n\n  /**\n   * Specify the output format, overriding the default (text)\n   */\n  outputFormat?: InfoFormatType;\n\n  /**\n   * Prettify the JSON.\n   *\n   * If not set or false, JSON will not be prettified.\n   * If true, JSON will be prettified with an indent of 2.\n   * If a positive integer, JSON will be prettified with an indent of this number.\n   *\n   * If prettify is set, a string will be returned if possible.\n   */\n  prettify?: boolean | number;\n}\n\n/**\n * Config generation options for the parser\n */\nexport interface GenerateConfigOptions {\n  //\n}\n\n/**\n * Conversion options for bitmark / JSON conversion\n */\nexport interface ConvertOptions {\n  /**\n   * The version of bitmark to output.\n   * If not specified, the version will be 3.\n   *\n   * Specifying the version will set defaults for other options.\n   * - Bitmark v2:\n   *   - bitmarkOptions.cardSetVersion: 1\n   *   - jsonOptions.textAsPlainText: true\n   * - Bitmark v3:\n   *   - bitmarkOptions.cardSetVersion: 2\n   *   - jsonOptions.textAsPlainText: false\n   *\n   */\n  bitmarkVersion?: BitmarkVersionType;\n\n  /**\n   * Specify the bitmark parser to use, overriding the default\n   */\n  bitmarkParserType?: BitmarkParserTypeType;\n\n  /**\n   * Set to force input to be interpreted as a particular format, overriding the auto-detection\n   * Auto-detection can fail or open unwanted files for strings that look like paths\n   */\n  inputFormat?: InputType;\n  /**\n   * Specify the output format, overriding the default\n   */\n  outputFormat?: OutputType;\n  /**\n   * Specify a file to write the output to\n   */\n  outputFile?: string;\n  /**\n   * Options for the output file\n   */\n  fileOptions?: FileOptions;\n  /**\n   * Options for bitmark generation\n   */\n  bitmarkOptions?: BitmarkOptions;\n  /**\n   * Options for JSON generation\n   */\n  jsonOptions?: JsonOptions;\n}\n\n/**\n * Prettify options for bitmark / JSON prettify / validate\n */\nexport interface UpgradeOptions {\n  /**\n   * The version of bitmark to output.\n   * If not specified, the version will be 3.\n   *\n   * Specifying the version will set defaults for other options.\n   * - Bitmark v2:\n   *   - bitmarkOptions.cardSetVersion: 1\n   *   - jsonOptions.textAsPlainText: true\n   * - Bitmark v3:\n   *   - bitmarkOptions.cardSetVersion: 2\n   *   - jsonOptions.textAsPlainText: false\n   *\n   */\n  bitmarkVersion?: BitmarkVersionType;\n\n  /**\n   * Specify the bitmark parser to use, overriding the default\n   */\n  bitmarkParserType?: BitmarkParserTypeType;\n\n  /**\n   * Set to force input to be interpreted as a particular format, overriding the auto-detection\n   * Auto-detection can fail or open unwanted files for strings that look like paths\n   */\n  inputFormat?: InputType;\n\n  /**\n   * Specify a file to write the output to\n   */\n  outputFile?: string;\n\n  /**\n   * Options for the output file\n   */\n  fileOptions?: FileOptions;\n\n  /**\n   * Options for bitmark generation\n   */\n  bitmarkOptions?: BitmarkOptions;\n\n  /**\n   * Options for JSON generation\n   */\n  jsonOptions?: JsonOptions;\n}\n\n/**\n * Conversion options for bitmark text / JSON conversion\n */\nexport interface ConvertTextOptions {\n  /**\n   * Specify the text format (default: bitmark++)\n   */\n  textFormat?: BodyTextFormatType;\n\n  /**\n   * Specify the text location (default: body)\n   */\n  textLocation?: TextLocationType;\n\n  /**\n   * Set to force input to be interpreted as a particular format, overriding the auto-detection\n   * Auto-detection can fail or open unwanted files for strings that look like paths\n   */\n  inputFormat?: InputType;\n\n  /**\n   * Specify a file to write the output to\n   */\n  outputFile?: string;\n\n  /**\n   * Options for the output file\n   */\n  fileOptions?: FileOptions;\n\n  /**\n   * Options for JSON generation\n   */\n  jsonOptions?: TextJsonOptions;\n}\n\n/**\n * Create AST options\n */\nexport interface CreateAstOptions {\n  /**\n   * Set to force input to be interpreted as a particular format, overriding the auto-detection\n   * Auto-detection can fail or open unwanted files for strings that look like paths\n   */\n  inputFormat?: InputType;\n}\n\nexport interface ExtractPlainTextOptions {\n  /**\n   * Set to force input to be interpreted as a particular format, overriding the auto-detection\n   * Auto-detection can fail for certain inputs as the input formats can overlap\n   */\n  inputFormat?: InputFormatType;\n}\n\n/**\n * Options for {@link BitmarkParserGenerator.convertHtmlTable}\n */\nexport interface ConvertHtmlTableOptions {\n  /**\n   * Force the input format, overriding auto-detection.\n   * - `html`: input is HTML; extract tables and output bitmark/JSON/AST\n   * - any other value: input is bitmark/JSON/AST; output HTML\n   */\n  inputFormat?: InputFormatType;\n\n  /**\n   * Output format.\n   * - HTML input: `bitmark` (default) | `json` | `ast` | `html` (re-emit / normalise)\n   * - bitmark/JSON/AST input: `html` (default, and only valid value)\n   */\n  outputFormat?: OutputType | 'html';\n\n  /**\n   * Bit type to emit when converting HTML to bits.\n   * `table-extended` (default, lossless) or `table` (lossy: drops spans/scope/sections).\n   */\n  tableFormat?: HtmlTableFormat;\n\n  /**\n   * Keep unmappable HTML tags as literal text instead of unwrapping them (HTML -> bits only).\n   */\n  keepUnknownTags?: boolean;\n\n  /**\n   * Disable breakscaping when generating bitmark table cell content from HTML.\n   * Useful when cells already contain raw bitmark that should pass through untouched.\n   */\n  noBreakscaping?: boolean;\n\n  /**\n   * Specify a file to write the output to\n   */\n  outputFile?: string;\n\n  /**\n   * Options for the output file\n   */\n  fileOptions?: FileOptions;\n\n  /**\n   * Options for bitmark generation (HTML -> bitmark)\n   */\n  bitmarkOptions?: BitmarkOptions;\n\n  /**\n   * Options for JSON generation (HTML -> json)\n   */\n  jsonOptions?: JsonOptions;\n}\n\n/**\n * Breakscape options\n */\nexport interface BreakscapeOptions {\n  /**\n   * Set to force input to be interpreted as a particular format, overriding the auto-detection\n   * Auto-detection can fail or open unwanted files for strings that look like paths\n   */\n  inputFormat?: InputType;\n\n  /**\n   * Specify a file to write the output to\n   */\n  outputFile?: string;\n\n  /**\n   * Options for the output file\n   */\n  fileOptions?: FileOptions;\n\n  /**\n   * Specify the text format (default:  bitmark++)\n   */\n  textFormat?: BodyTextFormatType;\n\n  /**\n   * Specify the text location (default: body)\n   */\n  textLocation?: TextLocationType;\n}\n\n/**\n * Unbreakscape options\n */\nexport interface UnbreakscapeOptions {\n  /**\n   * Set to force input to be interpreted as a particular format, overriding the auto-detection\n   * Auto-detection can fail or open unwanted files for strings that look like paths\n   */\n  inputFormat?: InputType;\n\n  /**\n   * Specify a file to write the output to\n   */\n  outputFile?: string;\n\n  /**\n   * Options for the output file\n   */\n  fileOptions?: FileOptions;\n\n  /**\n   * Specify the text format (default: bitmark++)\n   */\n  textFormat?: BodyTextFormatType;\n\n  /**\n   * Specify the text location (default: body)\n   */\n  textLocation?: TextLocationType;\n}\n\n/**\n * Input type enumeration\n */\nconst Input = {\n  /**\n   * Input is as a string\n   */\n  string: 'string',\n\n  /**\n   * Input is as a file path\n   */\n  file: 'file',\n} as const;\n\nexport type InputType = EnumType<typeof Input>;\n\n/**\n * Output type enumeration\n */\nconst Output = {\n  /**\n   * Output bitmark string\n   */\n  bitmark: 'bitmark',\n\n  /**\n   * Output JSON as a plain JS object, or a file\n   */\n  json: 'json',\n\n  /**\n   * Output AST as a plain JS object, or a file\n   */\n  ast: 'ast',\n\n  /**\n   * Output plain text as a string, or a file\n   */\n  text: 'text',\n} as const;\n\nexport type OutputType = EnumType<typeof Output>;\n\n/**\n * Input format enumeration\n */\nconst InputFormat = {\n  /**\n   * Input is bitmark\n   */\n  bitmark: 'bitmark',\n\n  /**\n   * Input is bitmarkText\n   */\n  bitmarkText: 'bitmarkText',\n\n  /**\n   * Input is plain text\n   */\n  plainText: 'plainText',\n\n  /**\n   * Input is HTML (used by convertHtmlTable)\n   */\n  html: 'html',\n} as const;\n\nexport type InputFormatType = EnumType<typeof InputFormat>;\n\n/**\n * Options for bitmark text JSON generation\n */\nexport interface TextJsonOptions {\n  /**\n   * Prettify the JSON.\n   *\n   * If not set or false, JSON will not be prettified.\n   * If true, JSON will be prettified with an indent of 2.\n   * If a positive integer, JSON will be prettified with an indent of this number.\n   *\n   * If prettify is set, a string will be returned if possible.\n   */\n  prettify?: boolean | number;\n\n  /**\n   * Stringify the JSON.\n   *\n   * If not set or false, JSON will be returned as a plain JS object.\n   * It true, JSON will be stringified.\n   *\n   * If prettify is set, it will override this setting.\n   */\n  stringify?: boolean;\n\n  /**\n   * [development only]\n   * Generate debug information in the output.\n   */\n  debugGenerationInline?: boolean;\n}\n\n/**\n * Bitmark tool for manipulating bitmark in all its formats.\n *\n */\nclass BitmarkParserGenerator {\n  protected ast = new Ast();\n  protected jsonParser = new JsonParser();\n  protected bitmarkParser = new BitmarkParser();\n  protected textParser = new TextParser();\n  protected textGenerator = new TextGenerator();\n\n  /**\n   * Get the version of the bitmark-parser-generator library\n   */\n  public version(): string {\n    return env.appVersion.full;\n  }\n\n  /**\n   * Get information about the bitmark-parser-generator library\n   */\n  public info(options?: InfoOptions): unknown {\n    const opts: InfoOptions = Object.assign({}, options);\n    const builder = new InfoBuilder();\n    let res: unknown;\n    const outputString = !opts.outputFormat || opts.outputFormat === InfoFormat.text;\n    const outputJson = opts.outputFormat === InfoFormat.json;\n    const all = opts.type === InfoType.all;\n    const deprecated = opts.type === InfoType.deprecated;\n    const includeNonDeprecated = all || !deprecated;\n    const includeDeprecated = all || deprecated;\n\n    if (opts.type === InfoType.bit) {\n      const bitConfigs = builder.getSupportedBitConfigs().filter((b) => {\n        if (!opts.bit) return true;\n        const bitType = Config.getBitType(opts.bit);\n        return bitType === b.bitType;\n      });\n      if (outputString) {\n        res = bitConfigs\n          .map((b) =>\n            b.toString({\n              includeChains: true,\n              includeConfigs: true,\n            }),\n          )\n          .join('\\n\\n--------------\\n\\n');\n      } else {\n        res = bitConfigs;\n      }\n    } else {\n      // List / List Deprecated\n      const supportedBits = builder\n        .getSupportedBits({\n          includeNonDeprecated,\n          includeDeprecated,\n        })\n        .filter((b) => {\n          if (!opts.bit) return true;\n          const bitType = Config.getBitType(opts.bit);\n          if (b.name === bitType) return true;\n        });\n      if (outputString) {\n        res = this.supportedBitsAsString(supportedBits);\n      } else {\n        res = supportedBits;\n      }\n    }\n\n    if (outputJson) {\n      const prettifySpace = opts.prettify === true ? 2 : opts.prettify || undefined;\n      res = JSON.stringify(res, null, prettifySpace);\n    }\n\n    return res;\n  }\n\n  /**\n   * Generate the new configuration for the bitmark parser.\n   */\n  public generateConfig(options?: GenerateConfigOptions): void {\n    const opts: GenerateConfigOptions = Object.assign({}, options);\n    const builder = new ConfigBuilder();\n    // let res: unknown;\n    // const outputString = !opts.outputFormat || opts.outputFormat === InfoFormat.text;\n    // const outputJson = opts.outputFormat === InfoFormat.json;\n    // const all = opts.type === InfoType.all;\n    // const deprecated = opts.type === InfoType.deprecated;\n    // const includeNonDeprecated = all || !deprecated;\n    // const includeDeprecated = all || deprecated;\n\n    builder.build(opts);\n  }\n\n  /**\n   * Convert bitmark from bitmark to JSON, or JSON to bitmark.\n   *\n   * Input type is detected automatically and may be:\n   * - string: bitmark, JSON, or AST\n   * - object: JSON or AST\n   * - file: bitmark, JSON, or AST\n   *\n   * Output type is selected automatically based on input type detection:\n   * - input(JSON/AST) ==> output(bitmark)\n   * - input(bitmark)  ==> output(JSON)\n   *\n   * Output type can be overridden to one of the following:\n   * - bitmark: output bitmark string\n   * - json: output JSON as a plain JS object, or a file\n   * - ast: output AST as a plain JS object, or a file\n   * - text: output plain text as a string, or a file\n   *\n   * By default, the result is returned as a string for bitmark, or a plain JS object for JSON/AST.\n   *\n   * The options can be used to write the output to a file and to set conversion options or override defaults.\n   *\n   * If both the input and output formats are the same, the input will be validated and rewritten.\n   * This feature be used to upgrade bitmark or JSON to the latest version.\n   *\n   * @param input - bitmark or JSON or AST as a string, JSON or AST as plain JS object, or path to a file containing\n   * bitmark, JSON, or AST.\n   * @param options - the conversion options\n   * @returns A string if converting to bitmark, a plain JS object if converting to JSON, or\n   * void if writing to a file\n   * @throws Error if any error occurs\n   */\n  public convert(input: string | unknown, options?: ConvertOptions): string | unknown | void {\n    let res: string | unknown | void;\n    const opts: ConvertOptions = Object.assign({}, options);\n    // const fileOptions = Object.assign({}, opts.fileOptions);\n    // const bitmarkOptions = Object.assign({}, opts.bitmarkOptions);\n    const jsonOptions = Object.assign({}, opts.jsonOptions);\n\n    const outputFormat = opts.outputFormat;\n    const outputBitmark = outputFormat === Output.bitmark;\n    const outputJson = outputFormat === Output.json;\n    const outputAst = outputFormat === Output.ast;\n    const outputText = outputFormat === Output.text;\n    const bitmarkParserType = BitmarkParserType.peggy; // Option is no longer used as only Peggy parser supported\n\n    let inStr: string = input as string;\n    const inputIsString = typeof input === 'string';\n\n    // Check if we are trying to write to a file in the browser\n    if (env.isBrowser && opts.outputFile) {\n      throw new Error('Cannot write to file in browser environment');\n    }\n\n    // If a file, read the file in\n    if (!opts.inputFormat || opts.inputFormat === Input.file) {\n      if (env.isNode) {\n        if (inputIsString && fs.existsSync(inStr)) {\n          inStr = fs.readFileSync(inStr, {\n            encoding: 'utf8',\n          });\n        }\n      }\n    }\n\n    // Preprocess as AST to see if AST\n    let ast = this.ast.preprocessAst(inStr);\n    const isAst = !!ast;\n\n    if (!isAst) {\n      // Not AST, so process as JSON to see if we have JSON\n      ast = this.jsonParser.toAst(inStr);\n    }\n    const isJson = !!ast?.bits;\n    const isBitmark = inputIsString && !isJson && !isAst; // Assume bitmark since not AST or JSON\n\n    // Helper conversion functions\n    const bitmarkToBitmark = (bitmarkStr: string) => {\n      // Validate and prettify\n      bitmarkToAst(bitmarkStr);\n      astToBitmark(res as BitmarkAst);\n    };\n\n    const bitmarkToAst = (bitmarkStr: string) => {\n      res = this.bitmarkParser.toAst(bitmarkStr, {\n        parserType: bitmarkParserType,\n      });\n    };\n\n    const bitmarkToJson = (bitmarkStr: string) => {\n      if (bitmarkParserType === BitmarkParserType.peggy) {\n        // Convert the bitmark to JSON using the peggy parser (aways true, only peggy parser supported)\n\n        // Generate AST from the Bitmark markup\n        ast = this.bitmarkParser.toAst(bitmarkStr, {\n          parserType: bitmarkParserType,\n        });\n\n        // Convert the AST to JSON\n        if (opts.outputFile) {\n          // Write JSON file\n          const generator = new JsonFileGenerator(opts.outputFile, opts);\n          generator.generateSync(ast);\n        } else {\n          // Generate JSON object\n          const generator = new JsonObjectGenerator(opts);\n          const json = generator.generateSync(ast);\n\n          // Return JSON as object or string depending on prettify/stringify option\n          res = this.jsonStringifyPrettify(json, jsonOptions);\n        }\n      }\n    };\n\n    const bitmarkToText = (bitmarkStr: string) => {\n      // Generate AST from the Bitmark markup\n      ast = this.bitmarkParser.toAst(bitmarkStr, {\n        parserType: bitmarkParserType,\n      });\n\n      // Generate JSON object\n      const jsonGenerator = new JsonObjectGenerator(opts);\n      const json = jsonGenerator.generateSync(ast);\n\n      const textGenerator = new PlainTextGenerator();\n\n      const str = textGenerator.generate(json);\n\n      if (opts.outputFile) {\n        // Write res to file\n        fs.writeFileSync(opts.outputFile, str as string, {\n          encoding: 'utf8',\n        });\n      } else {\n        res = str;\n      }\n    };\n\n    const astToBitmark = (astJson: BitmarkAst) => {\n      // Convert the AST to bitmark\n      if (opts.outputFile) {\n        // Write markup file\n        const generator = new BitmarkFileGenerator(opts.outputFile, opts);\n        generator.generateSync(astJson);\n      } else {\n        // Generate markup string\n        const generator = new BitmarkStringGenerator(opts);\n        res = generator.generateSync(astJson);\n      }\n    };\n\n    const astToAst = (astJson: BitmarkAst) => {\n      // Return JSON as object or string depending on prettify/stringify option\n      res = this.jsonStringifyPrettify(astJson, jsonOptions);\n    };\n\n    const astToJson = (astJson: BitmarkAst) => {\n      // Convert the AST to JSON\n      if (opts.outputFile) {\n        // Write JSON file\n        const generator = new JsonFileGenerator(opts.outputFile, opts);\n        generator.generateSync(astJson);\n      } else {\n        // Generate JSON object\n        const generator = new JsonObjectGenerator(opts);\n        const json = generator.generateSync(astJson);\n\n        // Return JSON as object or string depending on prettify/stringify option\n        res = this.jsonStringifyPrettify(json, jsonOptions);\n      }\n    };\n\n    const astToText = (astJson: BitmarkAst) => {\n      // Generate JSON object\n      const jsonGenerator = new JsonObjectGenerator(opts);\n      const json = jsonGenerator.generateSync(astJson);\n\n      const textGenerator = new PlainTextGenerator();\n\n      const str = textGenerator.generate(json);\n\n      if (opts.outputFile) {\n        // Write res to file\n        fs.writeFileSync(opts.outputFile, str as string, {\n          encoding: 'utf8',\n        });\n      } else {\n        res = str;\n      }\n    };\n\n    const jsonToBitmark = (astJson: BitmarkAst) => {\n      // We already have the ast from detecting the input type, so use the AST we already have\n\n      // Convert the JSON to bitmark\n      if (opts.outputFile) {\n        // Write markup file\n        const generator = new BitmarkFileGenerator(opts.outputFile, opts);\n        generator.generateSync(astJson);\n      } else {\n        // Generate markup string\n        const generator = new BitmarkStringGenerator(opts);\n        res = generator.generateSync(astJson);\n      }\n    };\n\n    const jsonToAst = (astJson: BitmarkAst) => {\n      // We already have the ast from detecting the input type, so just return the AST we already have\n\n      // Return JSON as object or string depending on prettify/stringify option\n      res = this.jsonStringifyPrettify(astJson, jsonOptions);\n    };\n\n    const jsonToText = (astJson: BitmarkAst) => {\n      // Generate JSON object\n      const jsonGenerator = new JsonObjectGenerator(opts);\n      const json = jsonGenerator.generateSync(astJson);\n\n      const textGenerator = new PlainTextGenerator();\n\n      const str = textGenerator.generate(json);\n\n      if (opts.outputFile) {\n        // Write res to file\n        fs.writeFileSync(opts.outputFile, str as string, {\n          encoding: 'utf8',\n        });\n      } else {\n        res = str;\n      }\n    };\n\n    const jsonToJson = (astJson: BitmarkAst) => {\n      // Validate and prettify\n      astToJson(astJson);\n    };\n\n    // Convert\n    if (isBitmark) {\n      // Input was Bitmark\n      if (outputBitmark) {\n        // Bitmark ==> Bitmark\n        bitmarkToBitmark(inStr);\n      } else if (outputAst) {\n        // Bitmark ==> AST\n        bitmarkToAst(inStr);\n      } else if (outputText) {\n        // Bitmark ==> Plain text\n        bitmarkToText(inStr);\n      } else {\n        // Bitmark ==> JSON\n        bitmarkToJson(inStr);\n      }\n    } else if (isAst) {\n      // Input was AST\n      ast = ast as BitmarkAst;\n      if (outputAst) {\n        // AST ==> AST\n        astToAst(ast);\n      } else if (outputJson) {\n        // AST ==> JSON\n        astToJson(ast);\n      } else if (outputText) {\n        // AST ==> Plain text\n        astToText(ast);\n      } else {\n        // AST ==> Bitmark\n        astToBitmark(ast);\n      }\n    } else if (isJson) {\n      // Input was JSON\n      ast = ast as BitmarkAst;\n      if (outputJson) {\n        // JSON ==> JSON\n        jsonToJson(ast);\n      } else if (outputAst) {\n        // JSON ==> AST\n        jsonToAst(ast);\n      } else if (outputText) {\n        // JSON ==> Plain text\n        jsonToText(ast);\n      } else {\n        // JSON ==> Bitmark\n        jsonToBitmark(ast);\n      }\n    } else {\n      // Input was not recognised, return an empty string\n      res = '';\n    }\n\n    return res;\n  }\n\n  /**\n   * Upgrade bitmark or JSON, upgrading to the latest supported syntax, removing unrecognised data in the process.\n   *\n   * THIS FEATURE SHOULD BE USED WITH CAUTION. IT WILL POTENTIALLY DELETE DATA.\n   *\n   * Input type is detected automatically and may be:\n   * - string: bitmark, JSON\n   * - object: JSON\n   * - file: bitmark, JSON\n   *\n   * Output type is the same as the detected input type\n   *\n   * By default, the result is returned as a string for bitmark, or a plain JS object for JSON.\n   *\n   * The options can be used to write the output to a file and to set conversion options or override defaults.\n   *\n   * If both the input and output formats are the same, the input will be validated and rewritten.\n   *\n   * @param input - bitmark or JSON or AST as a string, JSON or AST as plain JS object, or path to a file containing\n   * bitmark, JSON, or AST.\n   * @param options - the conversion options\n   * @returns Promise that resolves to string if upgrading to bitmark, a plain JS object if converting to JSON, or\n   * void if writing to a file\n   * @throws Error if any error occurs\n   */\n  public upgrade(input: string | unknown, options?: UpgradeOptions): string | unknown | void {\n    let res: string | unknown | void;\n    const opts: UpgradeOptions = Object.assign({}, options);\n    // const fileOptions = Object.assign({}, opts.fileOptions);\n    // const bitmarkOptions = Object.assign({}, opts.bitmarkOptions);\n    const jsonOptions = Object.assign({}, opts.jsonOptions);\n\n    const bitmarkParserType = opts.bitmarkParserType;\n\n    let inStr: string = input as string;\n    const inputIsString = typeof input === 'string';\n\n    // Check if we are trying to write to a file in the browser\n    if (env.isBrowser && opts.outputFile) {\n      throw new Error('Cannot write to file in browser environment');\n    }\n\n    // If a file, read the file in\n    if (!opts.inputFormat || opts.inputFormat === Input.file) {\n      if (env.isNode) {\n        if (inputIsString && fs.existsSync(inStr)) {\n          inStr = fs.readFileSync(inStr, {\n            encoding: 'utf8',\n          });\n        }\n      }\n    }\n\n    // Process as JSON to see if we have JSON\n    let ast = this.jsonParser.toAst(inStr);\n\n    const isJson = !!ast?.bits;\n    const isBitmark = inputIsString && !isJson; // Assume bitmark since not JSON\n\n    // Helper conversion functions\n    const bitmarkToBitmark = (bitmarkStr: string) => {\n      // Validate and upgrade\n      const astJson = this.bitmarkParser.toAst(bitmarkStr, {\n        parserType: bitmarkParserType,\n      });\n\n      // Convert the AST to bitmark\n      if (opts.outputFile) {\n        // Write markup file\n        const generator = new BitmarkFileGenerator(opts.outputFile, opts);\n        generator.generateSync(astJson);\n      } else {\n        // Generate markup string\n        const generator = new BitmarkStringGenerator(opts);\n        res = generator.generateSync(astJson);\n      }\n    };\n\n    const jsonToJson = (astJson: BitmarkAst) => {\n      // Validate and upgrade\n\n      // Convert the AST to JSON\n      if (opts.outputFile) {\n        // Write JSON file\n        const generator = new JsonFileGenerator(opts.outputFile, opts);\n        generator.generateSync(astJson);\n      } else {\n        // Generate JSON object\n        const generator = new JsonObjectGenerator(opts);\n        const json = generator.generateSync(astJson);\n\n        // Return JSON as object or string depending on prettify/stringify option\n        res = this.jsonStringifyPrettify(json, jsonOptions);\n      }\n    };\n\n    // Validate and Upgrade\n    if (isBitmark) {\n      // Bitmark ==> Bitmark\n      bitmarkToBitmark(inStr);\n    } else if (isJson) {\n      // JSON ==> JSON\n      ast = ast as BitmarkAst;\n      jsonToJson(ast);\n    } else {\n      // Input was not recognised\n      return;\n    }\n\n    return res;\n  }\n\n  /**\n   * Create a bitmark AST (Abstract Syntax Tree) from bitmark or JSON or AST\n   *\n   * Input type is detected automatically and may be string, object (JSON or AST), or file\n   *\n   * @param input the JSON or bitmark to convert to a bitmark AST\n   * @param options - the create AST options\n   * @returns bitmark AST\n   * @throws Error if any error occurs\n   */\n  public createAst(input: unknown, options?: CreateAstOptions): BitmarkAst {\n    let res: BitmarkAst;\n    let inStr: string = input as string;\n    const inputIsString = typeof input === 'string';\n    const opts: CreateAstOptions = Object.assign({}, options);\n\n    // If a file, read the file in\n    if (!opts.inputFormat || opts.inputFormat === Input.file) {\n      if (env.isNode) {\n        if (inputIsString && fs.existsSync(inStr)) {\n          inStr = fs.readFileSync(inStr, {\n            encoding: 'utf8',\n          });\n        }\n      }\n    }\n\n    // Preprocess as AST to see if AST\n    let ast = this.ast.preprocessAst(inStr);\n    const isAst = !!ast;\n\n    if (!isAst) {\n      // Not AST, so process as JSON to see if we have JSON\n      ast = this.jsonParser.toAst(inStr);\n    }\n    const isJson = !!ast?.bits;\n    const isBitmark = inputIsString && !isJson && !isAst; // Assume bitmark since not AST or JSON\n\n    if (isBitmark) {\n      // Bitmark ==> AST\n      res = this.bitmarkParser.toAst(inStr);\n    } else if (isJson) {\n      // JSON / AST ==> AST\n      res = ast as BitmarkAst;\n    } else {\n      // Input was not recognised, return an empty AST\n      res = {};\n    }\n\n    return res;\n  }\n\n  /**\n   * Convert bitmark text to JSON, or JSON to bitmark text.\n   *\n   * Input type is detected automatically and may be:\n   * - string: bitmark text or JSON\n   * - object: JSON\n   * - file: bitmark text or JSON\n   *\n   * Output type is selected automatically based on input type detection:\n   * - input(JSON) ==> output(bitmark text)\n   * - input(bitmark text)  ==> output(JSON)\n   *\n   * By default, the result is returned as a string for bitmark text, or a plain JS object for JSON.\n   *\n   * The options can be used to write the output to a file and to set conversion options or override defaults.\n   *\n   * @param input - bitmark text or JSON as a string, JSON as plain JS object, or path to a file containing\n   * bitmark text or JSON.\n   * @param options - the conversion options\n   * @returns Promise that resolves to string if converting to bitmark text, a plain JS object if converting to JSON, or\n   * void if writing to a file\n   * @throws Error if any error occurs\n   */\n  public convertText(\n    input: string | unknown,\n    options?: ConvertTextOptions,\n  ): string | unknown | void {\n    let res: string | unknown | void;\n    let preRes: string | unknown | void;\n    const opts: ConvertTextOptions = Object.assign({}, options);\n    const fileOptions = Object.assign({}, opts.fileOptions);\n    const jsonOptions = Object.assign({}, opts.jsonOptions);\n    const textFormat: TextFormatType =\n      Enum(TextFormat).fromValue(opts.textFormat) ?? TextFormat.bitmarkText;\n    const textLocation = opts.textLocation ?? TextLocation.body;\n\n    let inStr: string = input as string;\n    const inputIsString = typeof input === 'string';\n\n    // Check if we are trying to write to a file in the browser\n    if (env.isBrowser && opts.outputFile) {\n      throw new Error('Cannot write to file in browser environment');\n    }\n\n    // If a file, read the file in\n    if (!opts.inputFormat || opts.inputFormat === Input.file) {\n      if (env.isNode) {\n        if (inputIsString && fs.existsSync(inStr)) {\n          inStr = fs.readFileSync(inStr, {\n            encoding: 'utf8',\n          });\n        }\n      }\n    }\n\n    // Preprocess as text AST to see if text AST\n    const ast = this.textParser.preprocessAst(inStr);\n    const isAst = !!ast;\n\n    if (!isAst) {\n      preRes = this.textParser.toAst(inStr, {\n        format: textFormat,\n        location: TextLocation.body,\n      });\n    } else {\n      preRes = this.textGenerator.generateSync(ast, textFormat, textLocation);\n    }\n\n    if (opts.outputFile) {\n      const output = opts.outputFile.toString();\n      let strRes: string = preRes as string;\n      if (!isAst) {\n        strRes = this.jsonStringifyPrettify(preRes, jsonOptions, true) as string;\n      }\n\n      // Write JSON to file\n      const flag = fileOptions.append ? 'a' : 'w';\n      fs.ensureDirSync(path.dirname(output));\n      fs.writeFileSync(output, strRes, {\n        flag,\n      });\n    } else {\n      if (!isAst) {\n        res = this.jsonStringifyPrettify(preRes, jsonOptions) as string;\n      } else {\n        res = preRes;\n      }\n    }\n\n    return res;\n  }\n\n  public extractPlainText(input: string | unknown, options?: ExtractPlainTextOptions): string {\n    const dataIn: unknown = input;\n    const inputFormat = options?.inputFormat;\n    const isString = typeof input === 'string';\n\n    let data: unknown;\n\n    // Parse the input automatically, trying to detect if it's JSON, bitmark, or bitmark text, in that order\n    const parseAutomatically = (): unknown => {\n      let dataOut: unknown = dataIn;\n      if (typeof dataIn === 'string') {\n        try {\n          dataOut = JSON.parse(dataIn);\n        } catch (_e) {\n          // Not valid JSON – treat as bitmark, then bitmark text\n          let isBitmark = false;\n          const bitmarkData = this.convert(dataIn, {\n            outputFormat: Output.json,\n          }) as BitWrapperJson[];\n          if (bitmarkData.length > 0) {\n            const isError = bitmarkData[0].bit.type === BitType._error;\n            if (!isError) {\n              isBitmark = true;\n              dataOut = bitmarkData;\n            }\n          }\n          if (!isBitmark) {\n            // Not bitmark, so treat as bitmark text\n            dataOut = this.convertText(dataIn, {\n              textFormat: TextFormat.bitmarkText,\n            });\n          }\n        }\n      }\n      return dataOut;\n    };\n\n    // Parse the input based on the specified input format, or automatically if not specified\n    if (inputFormat === InputFormat.bitmark) {\n      data = this.convert(dataIn, {\n        outputFormat: Output.json,\n      }) as BitWrapperJson[];\n    } else if (inputFormat === InputFormat.bitmarkText) {\n      data = this.convertText(dataIn, {\n        textFormat: TextFormat.bitmarkText,\n      });\n    } else if (inputFormat === InputFormat.plainText) {\n      if (isString) data = String(input);\n    } else {\n      data = parseAutomatically();\n    }\n\n    // Convert the data to plain text\n    const generator = new PlainTextGenerator();\n    const res = generator.generate(data);\n\n    return res;\n  }\n\n  /**\n   * Convert between HTML tables and bitmark tables.\n   *\n   * Direction is auto-detected (override with `options.inputFormat`):\n   * - HTML input: every `<table>` is extracted and emitted as a `[.table-extended]` (or `[.table]`)\n   *   bit; output as bitmark (default), JSON, AST, or HTML (re-emit).\n   * - bitmark / JSON / AST input: each `table` / `table-extended` bit is rendered as an HTML\n   *   `<table>` fragment.\n   *\n   * Cell content is reproduced verbatim except inline conversion to bitmark marks (bold, italic,\n   * superscript, etc.), with lists and images mapped to their bitmark equivalents.\n   *\n   * @param input - HTML, bitmark, JSON or AST string; or a parsed JSON/AST value; or a file path.\n   * @param options - the conversion options\n   * @returns the converted output as a string (or object for JSON/AST), or void when writing a file\n   * @throws Error if any error occurs\n   */\n  public convertHtmlTable(\n    input: string | unknown,\n    options?: ConvertHtmlTableOptions,\n  ): string | unknown | void {\n    const opts: ConvertHtmlTableOptions = Object.assign({}, options);\n\n    if (env.isBrowser && opts.outputFile) {\n      throw new Error('Cannot write to file in browser environment');\n    }\n\n    let inStr: string = input as string;\n    const inputIsString = typeof input === 'string';\n\n    // If a file path, read the file in\n    if (env.isNode && inputIsString && fs.existsSync(inStr)) {\n      inStr = fs.readFileSync(inStr, { encoding: 'utf8' });\n    }\n\n    // Determine direction\n    const isHtmlString = (s: string): boolean => {\n      const t = s.replace(/^\\s+/, '');\n      return t.startsWith('<') && /<table/i.test(t);\n    };\n    let htmlInput: boolean;\n    if (opts.inputFormat === InputFormat.html) {\n      htmlInput = true;\n    } else if (opts.inputFormat != null) {\n      htmlInput = false; // any other forced format means input is bits\n    } else {\n      htmlInput = inputIsString && isHtmlString(inStr);\n    }\n\n    if (htmlInput) {\n      // HTML -> bits\n      const parser = new HtmlTableParser();\n      const bits = parser.parse(inStr, {\n        tableFormat: opts.tableFormat ?? 'table-extended',\n        keepUnknownTags: opts.keepUnknownTags,\n        onWarning: (m) => console.warn(m),\n      });\n\n      const outputFormat = opts.outputFormat ?? Output.bitmark;\n\n      if (outputFormat === 'html') {\n        // HTML -> HTML (normalise): build JSON then regenerate HTML\n        const json = this.convert(bits, { outputFormat: Output.json });\n        return this.outputHtml(new HtmlTableGenerator().generate(json), opts);\n      }\n\n      return this.convert(bits, {\n        outputFormat: Enum(Output).fromValue(outputFormat),\n        outputFile: opts.outputFile,\n        fileOptions: opts.fileOptions,\n        jsonOptions: opts.jsonOptions,\n        bitmarkOptions: {\n          ...opts.bitmarkOptions,\n          ...(opts.noBreakscaping ? { noBreakscaping: true } : {}),\n        },\n      });\n    }\n\n    // bits -> HTML\n    const outputFormat = opts.outputFormat ?? 'html';\n    if (outputFormat !== 'html') {\n      throw new Error(\n        'convertHtmlTable: non-HTML input can only be converted to HTML. ' +\n          'Use convert() for bitmark/JSON/AST conversions.',\n      );\n    }\n\n    const json = this.convert(inputIsString ? inStr : input, { outputFormat: Output.json });\n    return this.outputHtml(new HtmlTableGenerator().generate(json), opts);\n  }\n\n  /**\n   * Write an HTML string to the configured output file, or return it.\n   */\n  private outputHtml(html: string, opts: ConvertHtmlTableOptions): string | void {\n    if (opts.outputFile) {\n      const output = opts.outputFile.toString();\n      const flag = opts.fileOptions?.append ? 'a' : 'w';\n      fs.ensureDirSync(path.dirname(output));\n      fs.writeFileSync(output, html, { flag });\n      return;\n    }\n    return html;\n  }\n\n  /**\n   * Breakscape bitmark text.\n   *\n   * Input type is detected automatically and may be:\n   * - string: text\n   * - file: path to a file containing text\n   *\n   * By default, the result is returned as a string.\n   * By default, the text is breakscaped as if it was bitmark text in the body.\n   * Use the options to change this behaviour.\n   *\n   * The options can be used to write the output to a file.\n   *\n   * @param input - text, or path to a file containing text.\n   * @param options - the conversion options\n   * @returns breakscaped string, or void if writing to a file\n   * @throws Error if any error occurs\n   */\n  public breakscapeText(input: string, options?: BreakscapeOptions): string | void {\n    if (!input) return input;\n\n    const opts: BreakscapeOptions = Object.assign({}, options);\n    const fileOptions = Object.assign({}, opts.fileOptions);\n    const textFormat: TextFormatType =\n      Enum(TextFormat).fromValue(opts.textFormat) ?? TextFormat.bitmarkText;\n    const textLocation = opts.textLocation ?? TextLocation.body;\n\n    let inStr: string = input as string;\n    const inputIsString = typeof input === 'string';\n\n    // Check if we are trying to write to a file in the browser\n    if (env.isBrowser && opts.outputFile) {\n      throw new Error('Cannot write to file in browser environment');\n    }\n\n    // If a file, read the file in\n    if (!opts.inputFormat || opts.inputFormat === Input.file) {\n      if (env.isNode) {\n        if (inputIsString && fs.existsSync(inStr)) {\n          inStr = fs.readFileSync(inStr, {\n            encoding: 'utf8',\n          });\n        }\n      }\n    }\n\n    // Do the breakscape\n    const res = Breakscape.breakscape(inStr, {\n      format: textFormat,\n      location: textLocation,\n    });\n\n    if (opts.outputFile) {\n      const output = opts.outputFile.toString();\n\n      // Write JSON to file\n      const flag = fileOptions.append ? 'a' : 'w';\n      fs.ensureDirSync(path.dirname(output));\n      fs.writeFileSync(output, res, {\n        flag,\n      });\n    } else {\n      return res;\n    }\n  }\n\n  /**\n   * Unescape (unbreakscape) bitmark text\n   *\n   * Input type is detected automatically and may be:\n   * - string: text\n   * - file: path to a file containing text\n   *\n   * By default, the result is returned as a string.\n   * By default, the text is unbreakscaped as if it was bitmark text in the body.\n   * Use the options to change this behaviour.\n   *\n   * The options can be used to write the output to a file.\n   *\n   * @param input - text, or path to a file containing text.\n   * @param options - the conversion options\n   * @returns unbreakscaped string, or void if writing to a file\n   * @throws Error if any error occurs\n   */\n  public unbreakscapeText(input: string, options?: UnbreakscapeOptions): string | void {\n    if (!input) return input;\n\n    const opts: UnbreakscapeOptions = Object.assign({}, options);\n    const fileOptions = Object.assign({}, opts.fileOptions);\n    const textFormat: TextFormatType =\n      Enum(TextFormat).fromValue(opts.textFormat) ?? TextFormat.bitmarkText;\n    const textLocation = opts.textLocation ?? TextLocation.body;\n\n    let inStr: BreakscapedString = input as BreakscapedString;\n    const inputIsString = typeof input === 'string';\n\n    // Check if we are trying to write to a file in the browser\n    if (env.isBrowser && opts.outputFile) {\n      throw new Error('Cannot write to file in browser environment');\n    }\n\n    // If a file, read the file in\n    if (!opts.inputFormat || opts.inputFormat === Input.file) {\n      if (env.isNode) {\n        if (inputIsString && fs.existsSync(inStr)) {\n          inStr = fs.readFileSync(inStr, {\n            encoding: 'utf8',\n          }) as BreakscapedString;\n        }\n      }\n    }\n\n    // Do the unbreakscape\n    const res = Breakscape.unbreakscape(inStr, {\n      format: textFormat,\n      location: textLocation,\n    });\n\n    if (opts.outputFile) {\n      const output = opts.outputFile.toString();\n\n      // Write JSON to file\n      const flag = fileOptions.append ? 'a' : 'w';\n      fs.ensureDirSync(path.dirname(output));\n      fs.writeFileSync(output, res, {\n        flag,\n      });\n    } else {\n      return res;\n    }\n\n    return;\n  }\n\n  public textAstToPlainText(textAst: TextAst, _options?: ExtractPlainTextOptions): string {\n    const textGenerator = new TextGenerator(BitmarkVersion.v3, {\n      //\n    });\n\n    const res = textGenerator.generateSync(textAst, TextFormat.bitmarkText, TextLocation.body, {\n      noBreakscaping: true,\n      noMarkup: true,\n    });\n\n    return res;\n  }\n\n  /**\n   * Stringify / prettify a plain JS object to a JSON string, depending on the JSON options\n   *\n   * @param json\n   * @param options\n   * @param forceStringify\n   * @returns\n   */\n  private jsonStringifyPrettify = (\n    json: unknown,\n    options: JsonOptions,\n    forceStringify?: boolean,\n  ): unknown => {\n    const prettifySpace = options.prettify === true ? 2 : options.prettify || undefined;\n    const stringify = forceStringify || options.stringify === true || prettifySpace !== undefined;\n\n    if (stringify) {\n      return JSON.stringify(json, null, prettifySpace);\n    }\n    return json;\n  };\n\n  /**\n   * Get the supported bits as a formatted strings\n   *\n   * @param supportedBits\n   * @returns\n   */\n  private supportedBitsAsString(supportedBits: SupportedBit[]): string {\n    let res = '';\n\n    for (const rootBit of supportedBits) {\n      res += `${rootBit.name} (since: ${rootBit.since}`;\n      if (rootBit.deprecated) res += `, deprecated: ${rootBit.deprecated}`;\n      res += ')\\n';\n    }\n\n    return res;\n  }\n}\n\nexport { BitmarkParserGenerator, Input, InputFormat, Output };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { Ast, type NodeInfo } from '../../ast/Ast.ts';\nimport { StringWriter } from '../../ast/writer/StringWriter.ts';\nimport { type Writer } from '../../ast/writer/Writer.ts';\nimport { Breakscape } from '../../breakscaping/Breakscape.ts';\nimport { Config } from '../../config/Config.ts';\nimport { type BreakscapedString } from '../../model/ast/BreakscapedString.ts';\nimport {\n  type Bit,\n  type BitmarkAst,\n  type Body,\n  type BodyPart,\n  type Footer,\n} from '../../model/ast/Nodes.ts';\nimport { NodeType } from '../../model/ast/NodeType.ts';\nimport { type JsonText, type TextAst } from '../../model/ast/TextNodes.ts';\nimport {\n  ConfigKey,\n  configKeyToPropertyType,\n  configKeyToResourceType,\n} from '../../model/config/enum/ConfigKey.ts';\nimport type { PropertyTagConfig } from '../../model/config/PropertyTagConfig.ts';\nimport {\n  BitmarkVersion,\n  type BitmarkVersionType,\n  DEFAULT_BITMARK_VERSION,\n} from '../../model/enum/BitmarkVersion.ts';\nimport { BitType, type BitTypeType } from '../../model/enum/BitType.ts';\nimport { BodyBitType } from '../../model/enum/BodyBitType.ts';\nimport { CardSetVersion, type CardSetVersionType } from '../../model/enum/CardSetVersion.ts';\nimport { PropertyKey } from '../../model/enum/PropertyKey.ts';\nimport { ResourceType, type ResourceTypeType } from '../../model/enum/ResourceType.ts';\nimport { TagFormat, type TagFormatType } from '../../model/enum/TagFormat.ts';\nimport { TextFormat, type TextFormatType } from '../../model/enum/TextFormat.ts';\nimport { TextLocation, type TextLocationType } from '../../model/enum/TextLocation.ts';\nimport {\n  type BookJson,\n  type ChoiceJson,\n  type FeedbackChoiceJson,\n  type GroupTagJson,\n  type ImageSourceJson,\n  type IngredientJson,\n  type MarkConfigJson,\n  type PersonJson,\n  type PronunciationTableCellJson,\n  type RatingLevelStartEndJson,\n  type ResponseJson,\n  type ServingsJson,\n  type StatementJson,\n  type TableCellJson,\n  type TableExtendedJson,\n  type TableJson,\n  type TableRowJson,\n  type TableSectionJson,\n  type TechnicalTermJson,\n} from '../../model/json/BitJson.ts';\nimport {\n  type BodyBitJson,\n  type GapJson,\n  type HighlightTextJson,\n  type MarkJson,\n  type SelectOptionJson,\n} from '../../model/json/BodyBitJson.ts';\nimport {\n  type AudioResourceWrapperJson,\n  type ImageResourceJson,\n  type ImageResourceWrapperJson,\n  type ResourceDataJson,\n  type ResourceJson,\n} from '../../model/json/ResourceJson.ts';\nimport { normalizeTableFormat } from '../../parser/json/TableUtils.ts';\nimport { BooleanUtils } from '../../utils/BooleanUtils.ts';\nimport { ObjectUtils } from '../../utils/ObjectUtils.ts';\nimport { StringUtils } from '../../utils/StringUtils.ts';\nimport { AstWalkerGenerator } from '../AstWalkerGenerator.ts';\nimport { type GenerateOptions, TextGenerator } from '../text/TextGenerator.ts';\n\ntype TableSectionKey = 'header' | 'body' | 'footer';\n\nconst DEFAULT_OPTIONS: BitmarkOptions = {\n  debugGenerationInline: false,\n};\n\nconst DEFAULT_SPACES_AROUND_VALUES = 1;\nconst MAX_SPACES_AROUND_VALUES = 10;\n\n/**\n * Bitmark generation options\n */\nexport interface BitmarkOptions {\n  /**\n   * If true, always include bitmark text format even if it is the default for the bit\n   * If false, only include bitmark text format if it is not the default for the bit\n   */\n\n  explicitTextFormat?: boolean;\n\n  /**\n   * Prettify the JSON in the bitmark body.\n   *\n   * If not set or false, JSON will not be prettified.\n   * If true, JSON will be prettified with an indent of 2.\n   * If a positive integer, JSON will be prettified with an indent of this number.\n   */\n  prettifyJson?: boolean | number;\n\n  /**\n   * Card set version to generate:\n   * 1: === / == / --\n   * 2: ++==== / ==== / -- / ~~ / ====++\n   */\n  cardSetVersion?: CardSetVersionType;\n\n  /**\n   * The number of spaces to insert around values in the bitmark.\n   * If set to true, will use the default of 1 space.\n   * If set to false, will not insert any spaces.\n   * If set to a number, will insert that many spaces, up to a limit of 10.\n   *\n   * default: true\n   */\n  spacesAroundValues?: number | boolean;\n\n  /**\n   * [development only]\n   * Generate debug information in the output.\n   */\n  debugGenerationInline?: boolean;\n\n  /**\n   * Generate table cell content without breakscaping text.\n   */\n  noBreakscaping?: boolean;\n}\n\n/**\n * Bitmark generator options\n */\nexport interface BitmarkGeneratorOptions {\n  /**\n   * bitmarkVersion - The version of bitmark to output.\n   * If not specified, the version will default to 3.\n   *\n   * Specifying the version will set defaults for other options.\n   * - Bitmark v2:\n   *   - cardSetVersion: 1\n   * - Bitmark v3:\n   *   - cardSetVersion: 2\n   */\n  bitmarkVersion?: BitmarkVersionType;\n\n  /**\n   * The options for JSON generation.\n   */\n  bitmarkOptions?: BitmarkOptions;\n}\n\n/**\n * Generate bitmark markup from a bitmark AST\n *\n * NOTE: Newlines - a newline is written BEFORE each content that requries a newline\n *\n */\nclass BitmarkGenerator extends AstWalkerGenerator<BitmarkAst, void> {\n  protected ast = new Ast();\n  protected textGenerator: TextGenerator;\n  private bitmarkVersion: BitmarkVersionType;\n  private options: BitmarkOptions;\n  private mainWriter: Writer; // Used for writing the bitmark\n  private partWriter: StringWriter; // Used for writing parts which need to be assembled before writing to the main writer\n  private writer: Writer; // The current writer being used\n  private prettifySpace: number | undefined;\n  private spacesAroundValues: number;\n  private spacesAroundValuesStr: string;\n\n  // State\n  private bitType: BitTypeType = BitType._error;\n  private textFormat: TextFormatType = TextFormat.bitmarkText;\n  private isBodyBitmarkText = false;\n  private isCardAllowed = false;\n  private firstBit = true;\n  private hasCardSet = false;\n  private hasFooter = false;\n  private inTag = true;\n  private skipTableTraversal = false;\n\n  /**\n   * Generate bitmark markup from a bitmark AST\n   *\n   * @param writer - destination for the output\n   * @param bitmarkVersion - The version of bitmark to output.\n   * If not specified, the version will default to 3.\n   *\n   * Specifying the version will set defaults for other options.\n   * - Bitmark v2:\n   *   - cardSetVersion: 1\n   * - Bitmark v3:\n   *   - cardSetVersion: 2\n   *\n   * @param options - bitmark generation options\n   */\n  constructor(writer: Writer, options?: BitmarkGeneratorOptions) {\n    super();\n\n    // // Keep TS happy\n    // this.inTag;\n\n    // Bind callbacks\n    this.enter = this.enter.bind(this);\n    this.between = this.between.bind(this);\n    this.exit = this.exit.bind(this);\n    this.leaf = this.leaf.bind(this);\n    this.write = this.write.bind(this);\n    this.bodyBitCallback = this.bodyBitCallback.bind(this);\n\n    // Set options\n    this.bitmarkVersion =\n      Enum(BitmarkVersion).fromValue(options?.bitmarkVersion) ?? DEFAULT_BITMARK_VERSION;\n    this.options = {\n      ...DEFAULT_OPTIONS,\n      ...options?.bitmarkOptions,\n    };\n\n    this.debugGenerationInline = this.options.debugGenerationInline ?? false;\n\n    // Set defaults according to bitmark version\n    if (this.bitmarkVersion === BitmarkVersion.v2) {\n      if (this.options.cardSetVersion === undefined) {\n        this.options.cardSetVersion = CardSetVersion.v1;\n      }\n    } else {\n      if (this.options.cardSetVersion === undefined) {\n        this.options.cardSetVersion = CardSetVersion.v2;\n      }\n    }\n\n    // Calculate the prettify space\n    this.prettifySpace =\n      this.options.prettifyJson === true ? 2 : this.options.prettifyJson || undefined;\n\n    // Calculate the spaces around values\n    this.spacesAroundValues = this.calcSpacesAroundValues();\n    this.spacesAroundValuesStr = ' '.repeat(this.spacesAroundValues);\n\n    // Create the text generator\n    this.textGenerator = new TextGenerator(this.bitmarkVersion, {\n      writeCallback: this.write,\n      bodyBitCallback: this.bodyBitCallback,\n      debugGenerationInline: this.debugGenerationInline,\n    });\n\n    this.mainWriter = writer;\n    this.partWriter = new StringWriter();\n    this.writer = this.mainWriter;\n\n    this.generateResourceHandlers();\n    this.generatePropertyHandlers();\n  }\n\n  /**\n   * Generate bitmark markup from bitmark AST\n   *\n   * @param ast bitmark AST\n   */\n  public async generate(ast: BitmarkAst): Promise<void> {\n    // Reset the state\n    this.resetState();\n\n    // Open the writer\n    await this.writer.open();\n\n    // Walk the bitmark AST\n    this.walkAndWrite(ast);\n\n    // Ensure a blank line at end of file\n    this.writeLine();\n\n    // Close the writer\n    await this.writer.close();\n  }\n\n  /**\n   * Generate text from a bitmark text AST synchronously\n   *\n   * @param ast bitmark text AST\n   */\n  public generateSync(ast: BitmarkAst): void {\n    // Reset the state\n    this.resetState();\n\n    // Open the writer\n    this.writer.openSync();\n\n    // Walk the bitmark AST\n    this.walkAndWrite(ast);\n\n    // Close the writer\n    this.writer.closeSync();\n  }\n\n  private resetState(): void {\n    this.bitType = BitType._error;\n    this.textFormat = TextFormat.bitmarkText;\n    this.isBodyBitmarkText = false;\n    this.isCardAllowed = false;\n    this.firstBit = true;\n    this.hasCardSet = false;\n    this.hasFooter = false;\n    this.inTag = true;\n    this.printed = false;\n  }\n\n  private walkAndWrite(ast: BitmarkAst): void {\n    // Walk the bitmark AST\n    this.ast.walk(ast, NodeType.bitmarkAst, this, undefined);\n\n    // Ensure a blank line at end of file\n    this.writeLine();\n  }\n\n  //\n  // NODE HANDLERS\n  //\n\n  //\n  // Non-Terminal nodes (branches)\n  //\n\n  // bitmark\n\n  // bitmarkAst -> bits -> bitsValue\n\n  protected enter_bitsValue(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const bit = node.value as Bit;\n\n    const bitConfig = Config.getBitConfig(bit.bitType);\n    const bitResourcesConfig = Config.getBitResourcesConfig(bit.bitType, bit.resourceType);\n\n    // Set state variables\n    this.bitType = bit.bitType;\n    this.textFormat = bit.textFormat ?? bitConfig.textFormatDefault;\n    this.isBodyBitmarkText = this.textFormat === TextFormat.bitmarkText;\n    this.isCardAllowed = this.calculateIsCardAllowed();\n\n    this.hasCardSet = this.haveValidCardSet(bit);\n    this.hasFooter = this.haveValidFooter(bit);\n\n    // Separate the bits with 3 newlines\n    if (!this.firstBit) {\n      this.writeNL();\n      this.writeNL();\n      this.writeNL();\n    }\n\n    // Write the bit tag opening\n    this.writeOPD(bit.bitLevel);\n\n    if (bit.isCommented) this.writeString('|');\n    this.writeTagKey(bit.bitType);\n\n    if (bit.textFormat) {\n      const write = this.isWriteTextFormat(bit.textFormat, bitConfig.textFormatDefault);\n\n      if (write) {\n        this.writeColon();\n        this.writeTagKey(bit.textFormat);\n      }\n    }\n\n    // Use the bitConfig to see if we need to write the resourceType attachment\n    let resourceType: ResourceTypeType | undefined;\n    if (bitConfig.resourceAttachmentAllowed && bit.resources && bit.resources.length > 0) {\n      const comboMap = bitResourcesConfig.comboResourceConfigKeysMap;\n\n      if (bitResourcesConfig.comboResourceConfigKeysMap.size > 0) {\n        // The resource is a combo resource\n        // Extract the resource types from the combo resource\n        // NOTE: There should only ever be one combo resource per bit, but the code can handle multiple\n        // except for overwriting resourceJson\n        for (const comboTagType of comboMap.keys()) {\n          resourceType = configKeyToResourceType(comboTagType);\n        }\n      } else {\n        // Get the resourceType from the first resource and write it as the attachment resourceType\n        resourceType = bit.resources[0].type;\n      }\n    }\n\n    if (resourceType) {\n      this.writeAmpersand();\n      this.writeTagKey(resourceType);\n    }\n\n    this.writeCL();\n    // this.writeNL();\n\n    // Continue traversal\n    return true;\n  }\n\n  protected exit_bitsValue(_node: NodeInfo, _route: NodeInfo[]): void {\n    this.firstBit = false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> internalComment\n\n  protected enter_internalComment(node: NodeInfo, route: NodeInfo[]): boolean {\n    const internalComment = node.value as BreakscapedString[];\n\n    // Ignore values that are not at the bit level as they might be handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    for (let i = 0; i < internalComment.length; i++) {\n      const comment = internalComment[i];\n\n      this.writeNL();\n      this.writeProperty('internalComment', comment, route, {\n        format: TagFormat.plainText,\n        array: true,\n      });\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> groupTag\n\n  protected enter_groupTag(node: NodeInfo, route: NodeInfo[]): boolean {\n    const groupTag = node.value as GroupTagJson[];\n\n    // Ignore values that are not at the bit level as they might be handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    for (const gt of groupTag) {\n      const { name, tags } = gt;\n\n      // this.writeNL();\n      this.writeProperty('groupTag', name, route, {\n        format: TagFormat.plainText,\n        writeEmpty: true,\n      });\n      if (tags && tags.length > 0) {\n        for (const t of tags) {\n          this.writeProperty('tag', t, route, {\n            format: TagFormat.plainText,\n            writeEmpty: true,\n            forceChain: true,\n          });\n        }\n      }\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> labelTrue / labelFalse\n\n  protected leaf_labelTrue(node: NodeInfo, route: NodeInfo[]): boolean {\n    const value = node.value as string | undefined;\n\n    // Ignore example that is not at the bit level as it are handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    const bit = parent?.value as Bit;\n    if (bit) {\n      const haveTrue = value != '';\n      const haveFalse = bit.labelFalse && bit.labelFalse != '';\n      if (haveTrue || haveFalse) {\n        this.writeNL();\n      }\n      if (haveTrue)\n        this.writeProperty('labelTrue', value, route, {\n          format: TagFormat.plainText,\n          forceChain: true,\n        });\n      if (haveFalse)\n        this.writeProperty('labelFalse', bit.labelFalse, route, {\n          format: TagFormat.plainText,\n          forceChain: true,\n        });\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  protected leaf_labelFalse(_node: NodeInfo, _route: NodeInfo[]): boolean {\n    // Handled above in enter_labelTrue(), but this function needed to block automatic property handling\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> imageSource\n\n  protected enter_imageSource(node: NodeInfo, route: NodeInfo[]): boolean {\n    const imageSource = node.value as ImageSourceJson;\n\n    // Ignore values that are not at the bit level as they might be handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    const { url, mockupId, size, format, trim } = imageSource;\n\n    // this.writeNL();\n    this.writeProperty('imageSource', url, route, {\n      format: TagFormat.plainText,\n    });\n    if (url) {\n      if (mockupId)\n        this.writeProperty('mockupId', mockupId, route, {\n          format: TagFormat.plainText,\n          forceChain: true,\n        });\n      if (size)\n        this.writeProperty('size', size, route, {\n          format: TagFormat.plainText,\n          forceChain: true,\n        });\n      if (format)\n        this.writeProperty('format', format, route, {\n          format: TagFormat.plainText,\n          forceChain: true,\n        });\n      if (BooleanUtils.isBoolean(trim))\n        this.writeProperty('trim', trim, route, {\n          format: TagFormat.plainText,\n          forceChain: true,\n        });\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> technicalTerm\n\n  protected enter_technicalTerm(node: NodeInfo, route: NodeInfo[]): boolean {\n    const nodeValue = node.value as TechnicalTermJson;\n\n    // Ignore values that are not at the bit level as they might be handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    const { technicalTerm, lang } = nodeValue;\n\n    // this.writeNL();\n    this.writeProperty('technicalTerm', technicalTerm, route, {\n      format: TagFormat.plainText,\n    });\n    if (lang != null) {\n      this.writeProperty('lang', lang, route, {\n        format: TagFormat.plainText,\n        forceChain: true,\n      });\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> servings\n\n  protected enter_servings(node: NodeInfo, route: NodeInfo[]): boolean {\n    const nodeValue = node.value as ServingsJson;\n\n    // Ignore values that are not at the bit level as they might be handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    const {\n      servings,\n      unit,\n      unitPlural,\n      unitAbbr,\n      unitAbbrPlural,\n      decimalPlaces,\n      disableCalculation,\n      hint,\n    } = nodeValue;\n\n    // this.writeNL();\n    this.writeProperty('servings', servings, route, {\n      format: TagFormat.plainText,\n    });\n    if (unit != null) {\n      this.writeProperty('unit', unit, route, {\n        format: TagFormat.plainText,\n        forceChain: true,\n      });\n    }\n    if (unitPlural != null) {\n      this.writeProperty('unitPlural', unitPlural, route, {\n        format: TagFormat.plainText,\n        forceChain: true,\n      });\n    }\n    if (unitAbbr != null) {\n      this.writeProperty('unitAbbr', unitAbbr, route, {\n        format: TagFormat.plainText,\n        forceChain: true,\n      });\n    }\n    if (unitAbbrPlural != null) {\n      this.writeProperty('unitAbbrPlural', unitAbbrPlural, route, {\n        format: TagFormat.plainText,\n        forceChain: true,\n      });\n    }\n    if (decimalPlaces != null) {\n      this.writeProperty('decimalPlaces', decimalPlaces, route, {\n        format: TagFormat.plainText,\n        forceChain: true,\n      });\n    }\n    if (disableCalculation != null) {\n      this.writeProperty('disableCalculation', disableCalculation, route, {\n        format: TagFormat.plainText,\n        forceChain: true,\n      });\n    }\n    if (hint != null) {\n      this.writeOPQ();\n      this.writeTextOrValue(hint, TextFormat.plainText, TextLocation.tag);\n      this.writeCL();\n    }\n\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> person\n\n  protected enter_person(node: NodeInfo, route: NodeInfo[]): boolean {\n    const person = node.value as PersonJson;\n\n    // Ignore values that are not at the bit level as they might be handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    const { name, title, avatarImage } = person;\n\n    // this.writeNL();\n    this.writeProperty('person', name, route, {\n      format: TagFormat.plainText,\n    });\n    if (title) {\n      this.writeProperty('title', title, route, {\n        format: TagFormat.plainText,\n        forceChain: true,\n      });\n    }\n    if (avatarImage) {\n      this.writeResource(ResourceType.image, avatarImage.image.src);\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> definitions -> definitionsValue -> term -> text\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> definitions -> definitionsValue -> definition -> text\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> definitions -> definitionsValue -> alternativeDefinitions\n  // -> alternativeDefinitionsValue -> text\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> flashcards -> flashcardsValue -> question -> text\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> flashcards -> flashcardsValue -> answer -> text\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> flashcards -> flashcardsValue -> alternativeAnswers ->\n  // -> alternativeAnswersValue -> text\n\n  protected enter_text(node: NodeInfo, route: NodeInfo[]): boolean {\n    const parent = this.getParentNode(route);\n    if (\n      !parent ||\n      (parent.key !== NodeType.term &&\n        parent.key !== NodeType.definition &&\n        parent.key !== NodeType.alternativeDefinitionsValue &&\n        parent.key !== NodeType.question &&\n        parent.key !== NodeType.answer &&\n        parent.key !== NodeType.alternativeAnswersValue)\n    ) {\n      return true;\n    }\n\n    if (node.value) {\n      this.writeNL();\n      this.writeTextOrValue(node.value, this.textFormat, TextLocation.body);\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  protected leaf_text(node: NodeInfo, route: NodeInfo[]): boolean {\n    const parent = this.getParentNode(route);\n    if (\n      !parent ||\n      (parent.key !== NodeType.term &&\n        parent.key !== NodeType.definition &&\n        parent.key !== NodeType.alternativeDefinitionsValue &&\n        parent.key !== NodeType.question &&\n        parent.key !== NodeType.answer &&\n        parent.key !== NodeType.alternativeAnswersValue &&\n        parent.key !== NodeType.reason)\n    ) {\n      return true;\n    }\n\n    if (StringUtils.isString(node.value)) {\n      this.writeNL();\n      this.writeTextOrValue(node.value, this.textFormat, TextLocation.body);\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> * -> term -> icon\n  // bitmarkAst -> bits -> bitsValue -> * -> definition -> icon\n  // bitmarkAst -> bits -> bitsValue -> * -> alternativeDefinitionsValue -> icon\n  protected enter_icon(node: NodeInfo, route: NodeInfo[]): boolean {\n    const resource = node.value as ImageResourceWrapperJson;\n\n    const parent = this.getParentNode(route);\n    if (!parent) return true;\n\n    if (\n      parent.key !== NodeType.term &&\n      parent.key !== NodeType.definition &&\n      parent.key !== NodeType.alternativeDefinitionsValue &&\n      parent.key !== NodeType.question &&\n      parent.key !== NodeType.answer &&\n      parent.key !== NodeType.alternativeAnswersValue\n    ) {\n      // Continue traversal of this branch\n      return true;\n    }\n\n    // This is a resource, so handle it with the common code\n    // this.writeNL();\n    this.writeResource(ResourceType.icon, resource.image.src);\n    // this.writePropertyStyleResource(ResourceType.icon, resource as ResourceJson);\n\n    // Continue traversal of this branch (for the chained properties)\n    return true;\n  }\n\n  protected leaf_iconValue(node: NodeInfo, route: NodeInfo[]): boolean {\n    // Handle as a standard icon property\n    this.writeNL();\n    this.writeProperty('icon', node.value, route, {\n      format: TagFormat.plainText,\n    });\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> ratingLevelStart\n  protected enter_ratingLevelStart(node: NodeInfo, route: NodeInfo[]): boolean {\n    this.enterRatingLevelStartEndCommon(node, route);\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> ratingLevelEnd\n  protected enter_ratingLevelEnd(node: NodeInfo, route: NodeInfo[]): boolean {\n    this.enterRatingLevelStartEndCommon(node, route);\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // Common code for ratingLevelStart and ratingLevelEnd\n  protected enterRatingLevelStartEndCommon(node: NodeInfo, route: NodeInfo[]): boolean {\n    const n = node.value as RatingLevelStartEndJson;\n\n    // Ignore values that are not at the bit level as they might be handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    const { level, label } = n;\n    const levelKey = node.key === NodeType.ratingLevelStart ? 'ratingLevelStart' : 'ratingLevelEnd';\n\n    // this.writeNL();\n    this.writeProperty(levelKey, level, route, {\n      format: TagFormat.plainText,\n    });\n    if (label) {\n      this.writeProperty('label', label, route, {\n        format: TagFormat.bitmarkText,\n        forceChain: true,\n      });\n    }\n\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> markConfig\n\n  protected enter_markConfig(_node: NodeInfo, _route: NodeInfo[]): boolean {\n    // Handler so markConfig is not processed by the default property handler\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> markConfig -> markConfigValue\n\n  protected enter_markConfigValue(node: NodeInfo, route: NodeInfo[]): boolean {\n    const markConfig = node.value as MarkConfigJson;\n\n    // Ignore values that are not at the correct level as they might be handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.markConfig) return true;\n\n    const { mark, color, emphasis } = markConfig;\n\n    if (mark) {\n      this.writeNL();\n      this.writeProperty('mark', mark, route, {\n        format: TagFormat.plainText,\n      });\n      if (color) {\n        this.writeProperty('color', color, route, {\n          format: TagFormat.plainText,\n          forceChain: true,\n        });\n      }\n      if (emphasis) {\n        this.writeProperty('emphasis', emphasis, route, {\n          format: TagFormat.plainText,\n          forceChain: true,\n        });\n      }\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> partialAnswer\n\n  protected enter_partialAnswer(node: NodeInfo, route: NodeInfo[]): boolean {\n    if (node.value) {\n      // this.writeNL();\n      this.writeProperty('partialAnswer', node.value, route, {\n        format: TagFormat.plainText,\n      });\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> questions -> questionsValue -> partialAnswer\n\n  protected leaf_partialAnswer(node: NodeInfo, route: NodeInfo[]): boolean {\n    if (node.value) {\n      // this.writeNL();\n      this.writeProperty('partialAnswer', node.value, route, {\n        format: TagFormat.plainText,\n      });\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> sampleSolution\n  // bitmarkAst -> bits -> bitsValue -> questions -> questionsValue -> sampleSolution\n\n  protected enter_sampleSolution(node: NodeInfo, route: NodeInfo[]): boolean {\n    if (node.value) {\n      // this.writeNL();\n      this.writeProperty('sampleSolution', node.value, route, {\n        format: TagFormat.plainText,\n      });\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  protected leaf_sampleSolution(node: NodeInfo, route: NodeInfo[]): boolean {\n    if (node.value) {\n      // this.writeNL();\n      this.writeProperty('sampleSolution', node.value, route, {\n        format: TagFormat.plainText,\n      });\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> reasonableNumOfChars\n  // bitmarkAst -> bits -> bitsValue -> questions -> questionsValue -> reasonableNumOfChars\n\n  protected leaf_reasonableNumOfChars(node: NodeInfo, route: NodeInfo[]): void {\n    // this.writeNL();\n    this.writeProperty('reasonableNumOfChars', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> sourceBB\n\n  protected enter_sourceBB(node: NodeInfo, route: NodeInfo[]): boolean {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return false;\n\n    const tuples = node.value as number[][] | undefined;\n    if (!Array.isArray(tuples) || tuples.length === 0) return false;\n\n    this.writeProperty(\n      'sourceBB',\n      tuples.map((t) => t.join(', ')),\n      route,\n      {\n        format: TagFormat.plainText,\n        array: true,\n      },\n    );\n\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> questions -> questionsValue -> additionalSolutions -> additionalSolutionsValue\n\n  protected leaf_additionalSolutionsValue(node: NodeInfo, route: NodeInfo[]): void {\n    // Ignore values that are not at the bit level as they might be handled elsewhere\n    const parent = this.getParentNode(route, 2);\n    if (parent?.key !== NodeType.questionsValue) return;\n\n    this.writeNL();\n    this.writeProperty('additionalSolutions', node.value, route, {\n      format: TagFormat.plainText,\n      array: true,\n      writeEmpty: true,\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> item\n\n  protected enter_item(node: NodeInfo, route: NodeInfo[]): boolean {\n    const item = node.value as TextAst;\n    const parent = this.getParentNode(route);\n    if (this.isEmptyText(item)) return false; // Ignore empty\n    if (!this.isEmptyText(parent?.value?.lead)) return true; // Will be handled by lead\n    if (!this.isEmptyText(parent?.value?.pageNumber)) return true; // Will be handled by pageNumber\n    if (!this.isEmptyText(parent?.value?.marginNumber)) return true; // Will be handled by marginNumber\n\n    this.writeNL_IfNotChain(route);\n    this.writeOPC();\n    this.writeTextOrValue(item, TextFormat.bitmarkText, TextLocation.tag);\n    this.writeCL();\n\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> lead\n\n  protected enter_lead(node: NodeInfo, route: NodeInfo[]): boolean {\n    const lead = node.value as TextAst;\n    const parent = this.getParentNode(route);\n    if (this.isEmptyText(lead)) return false; // Ignore empty\n    if (!this.isEmptyText(parent?.value?.pageNumber)) return true; // Will be handled by pageNumber\n    if (!this.isEmptyText(parent?.value?.marginNumber)) return true; // Will be handled by marginNumber\n\n    this.writeNL_IfNotChain(route);\n    this.writeOPC();\n    this.writeTextOrValue(parent?.value?.item ?? '', TextFormat.bitmarkText, TextLocation.tag);\n    this.writeCL();\n    this.writeOPC();\n    this.writeTextOrValue(lead, TextFormat.bitmarkText, TextLocation.tag);\n    this.writeCL();\n\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> pageNumber\n\n  protected enter_pageNumber(node: NodeInfo, route: NodeInfo[]): boolean {\n    const pageNumber = node.value as TextAst;\n    const parent = this.getParentNode(route);\n    if (this.isEmptyText(pageNumber)) return false; // Ignore empty\n    if (!this.isEmptyText(parent?.value?.marginNumber)) return true; // Will be handled by marginNumber\n\n    this.writeNL_IfNotChain(route);\n    this.writeOPC();\n    this.writeTextOrValue(parent?.value?.item ?? '', TextFormat.bitmarkText, TextLocation.tag);\n    this.writeCL();\n    this.writeOPC();\n    this.writeTextOrValue(parent?.value?.lead ?? '', TextFormat.bitmarkText, TextLocation.tag);\n    this.writeCL();\n    this.writeOPC();\n    this.writeTextOrValue(pageNumber ?? '', TextFormat.bitmarkText, TextLocation.tag);\n    this.writeCL();\n\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> marginNumber\n\n  protected enter_marginNumber(node: NodeInfo, route: NodeInfo[]): boolean {\n    const marginNumber = node.value as TextAst;\n    const parent = this.getParentNode(route);\n    if (this.isEmptyText(marginNumber)) return false; // Ignore empty\n\n    this.writeNL_IfNotChain(route);\n    this.writeOPC();\n    this.writeTextOrValue(parent?.value?.item ?? '', TextFormat.bitmarkText, TextLocation.tag);\n    this.writeCL();\n    this.writeOPC();\n    this.writeTextOrValue(parent?.value?.lead ?? '', TextFormat.bitmarkText, TextLocation.tag);\n    this.writeCL();\n    this.writeOPC();\n    this.writeTextOrValue(\n      parent?.value?.pageNumber ?? '',\n      TextFormat.bitmarkText,\n      TextLocation.tag,\n    );\n    this.writeCL();\n    this.writeOPC();\n    this.writeTextOrValue(marginNumber, TextFormat.bitmarkText, TextLocation.tag);\n    this.writeCL();\n\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> body\n\n  protected enter_body(node: NodeInfo, route: NodeInfo[]): boolean {\n    // Ignore values that are not at the bit level as they might be handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue && parent?.key !== NodeType.cardBitsValue) return true;\n\n    this.inTag = false;\n\n    // Always write a NL before the body content if there is any (see Handle body)\n    const body = node.value as Body;\n\n    // Handle body\n    if (this.textFormat === TextFormat.json) {\n      const json = body.body ?? null;\n      if (Array.isArray(json) || ObjectUtils.isObject(json)) {\n        const text = JSON.stringify(json, null, this.prettifySpace);\n        if (text) {\n          this.writePlainTextDivider();\n          this.writeNL();\n          this.writeTextOrValue(text, TextFormat.plainText, TextLocation.body);\n        }\n      }\n    } else if (this.isBodyBitmarkText) {\n      // handle bitmark text\n      const plainTextDividerAllowed = !(this.hasCardSet || this.hasFooter);\n      this.writeNL();\n      // The text generator will write to the writer\n      const b = (Array.isArray(body.body) ? body.body : []) as TextAst;\n      this.writeTextOrValue(b, this.textFormat, TextLocation.body, {\n        plainTextDividerAllowed,\n      });\n    } else {\n      // handle plain text\n      this.writePlainTextDivider();\n      this.writeNL();\n      const s = (StringUtils.isString(body.body) ? body.body : '') as string;\n      this.writeTextOrValue(`${s}`, TextFormat.plainText, TextLocation.body);\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  protected exit_body(_node: NodeInfo, _route: NodeInfo[]): void {\n    this.inTag = true;\n  }\n\n  protected bodyBitCallback(bodyBit: BodyBitJson, _index: number, _route: NodeInfo[]): string {\n    // console.log('bodyBitCallback', bodyBit, index, route);\n\n    // Walk the body bit AST\n    const nodeType = Enum(NodeType).fromValue(bodyBit.type) ?? NodeType.bodyBit;\n    this.ast.walk(bodyBit, nodeType, this, undefined);\n\n    return ''; // Return empty string as we are writing to the writer\n  }\n\n  // bodyBit -> gap\n\n  protected enter_gap(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const gap = node.value as GapJson;\n\n    if (gap.solutions && gap.solutions.length === 0) {\n      // If there are no solutions, we need to write the special cloze gap [_] to indicate this\n      this.writeOPU();\n      this.writeCL();\n    } else {\n      for (const solution of gap.solutions) {\n        this.writeOPU();\n        this.writeTextOrValue(solution, TextFormat.plainText, TextLocation.tag);\n        this.writeCL();\n      }\n    }\n\n    // Continue traversal\n    return true;\n  }\n\n  // bodyBit -> mark\n\n  protected enter_mark(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const mark = node.value as MarkJson;\n\n    this.writeOPE();\n    this.writeTextOrValue(mark.solution, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n\n    // Continue traversal\n    return true;\n  }\n\n  // bodyBit -> select\n\n  protected enter_select(_node: NodeInfo, _route: NodeInfo[]): boolean {\n    // Continue traversal\n    return true;\n  }\n\n  // bodyBit -> highlight\n\n  protected enter_highlight(_node: NodeInfo, _route: NodeInfo[]): boolean {\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> footer\n\n  protected enter_footer(node: NodeInfo, route: NodeInfo[]): boolean {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    const footer = node.value as Footer;\n\n    // Handle footer\n    if (this.textFormat === TextFormat.json) {\n      // Json footer?!\n      // Not valid, ignore\n    } else if (footer.footer && footer.footer.length > 0) {\n      if (this.isBodyBitmarkText) {\n        // handle bitmark text\n        this.writeNL();\n        this.writeTextOrValue('==== footer ====', TextFormat.plainText, TextLocation.body);\n        this.writeNL();\n        // The text generator will write to the writer\n        this.writeTextOrValue(footer.footer, this.textFormat, TextLocation.body, {\n          plainTextDividerAllowed: true, // Always allowed for the footer.\n        });\n      } else {\n        // Plain text footer?!\n        // Not valid, ignore (plain text cannot have a card set / footer marker, so cannot have a footer!\n      }\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> body -> bodyParts -> bodyPartsValue -> data -> solutions\n\n  protected enter_solutions(node: NodeInfo, route: NodeInfo[]): boolean {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    const solutions = node.value as string[];\n    if (solutions && solutions.length === 0) {\n      // If there are no solutions, we need to write the special cloze gap [_] to indicate this\n      this.writeOPU();\n      this.writeCL();\n    }\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> body -> bodyParts -> bodyPartsValue -> data -> solution\n\n  protected leaf_solution(node: NodeInfo, route: NodeInfo[]): void {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return;\n\n    const solution = node.value as string;\n\n    // Ignore values that are not at the correct level as they might be handled elsewhere\n    const bodyPartsValue: BodyPart | undefined = this.getParentNode(route, 2)?.value;\n    if (bodyPartsValue?.type !== BodyBitType.mark) return;\n\n    if (solution) {\n      this.writeOPE();\n      this.writeTextOrValue(solution, TextFormat.plainText, TextLocation.tag);\n      this.writeCL();\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> body -> bodyBit -> mark -> mark\n\n  protected leaf_mark(node: NodeInfo, route: NodeInfo[]): void {\n    const root = route[0];\n    if (root?.key !== NodeType.mark) return;\n\n    const mark = node.value as string;\n\n    if (mark) {\n      this.writeProperty('mark', mark, route, {\n        format: TagFormat.plainText,\n      });\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> body -> bodyParts -> bodyPartsValue -> data -> options -> optionsValue\n\n  protected enter_optionsValue(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const selectOption = node.value as SelectOptionJson;\n    if (selectOption.isCorrect) {\n      this.writeOPP();\n    } else {\n      this.writeOPM();\n    }\n    this.writeTextOrValue(selectOption.text, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> body -> bodyParts -> bodyPartsValue -> data -> texts -> textsValue\n\n  protected enter_textsValue(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const highlightText = node.value as HighlightTextJson;\n    if (highlightText.isCorrect) {\n      this.writeOPP();\n    } else {\n      this.writeOPM();\n    }\n    this.writeTextOrValue(highlightText.text, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode\n\n  protected enter_cardNode(_node: NodeInfo, _route: NodeInfo[]): boolean {\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return true;\n\n    this.writeCardSetStart();\n\n    // Continue traversal\n    return true;\n  }\n\n  protected between_cardNode(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    this.writeCardSetCardDivider();\n  }\n\n  protected exit_cardNode(_node: NodeInfo, _route: NodeInfo[]): void {\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    this.writeCardSetEnd();\n    if (this.options.cardSetVersion === CardSetVersion.v1) {\n      // this.writeNL();\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> elements\n\n  protected enter_elements(_node: NodeInfo, _route: NodeInfo[]): void {\n    //\n  }\n\n  protected between_elements(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    this.writeCardSetSideDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> flashcards\n\n  protected between_flashcards(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> flashcards -> flashcardsValue\n\n  protected between_flashcardsValue(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    if (right.key === NodeType.answer) {\n      this.writeCardSetSideDivider();\n    } else if (right.key === NodeType.alternativeAnswers && right.value?.length !== 0) {\n      this.writeCardSetVariantDivider();\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> flashcards -> flashcardsValue -> alternativeAnswers\n\n  protected between_alternativeAnswers(_node: NodeInfo, _route: NodeInfo[]): void {\n    this.writeCardSetVariantDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> definitions -> definitionsValue -> alternativeDefintions\n\n  protected between_alternativeDefinitions(_node: NodeInfo, _route: NodeInfo[]): void {\n    this.writeCardSetVariantDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> statements\n\n  protected enter_statements(_node: NodeInfo, _route: NodeInfo[]): void {\n    //\n  }\n\n  protected between_statements(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    const isTrueFalse1 = this.isOfBitType(BitType.trueFalse1);\n\n    if (!isTrueFalse1) {\n      this.writeCardSetCardDivider();\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> statements -> statementsValue\n\n  protected enter_statementsValue(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const statement = node.value as StatementJson;\n\n    this.writeNL();\n    if (statement.isCorrect) {\n      this.writeOPP();\n    } else {\n      this.writeOPM();\n    }\n    this.writeTextOrValue(statement.statement, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> choices -> choicesValue\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> quizzes -> quizzesValue -> choices -> choicesValue\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> feedbacks -> feedbacksValue -> choices -> choicesValue\n\n  protected enter_choicesValue(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const choice = node.value as ChoiceJson & FeedbackChoiceJson;\n\n    this.writeNL();\n    if (choice.isCorrect || choice.requireReason) {\n      this.writeOPP();\n    } else {\n      this.writeOPM();\n    }\n    this.writeTextOrValue(choice.choice, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> responses -> responsesValue\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> quizzes -> quizzesValue -> responses -> responsesValue\n\n  protected enter_responsesValue(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const response = node.value as ResponseJson;\n\n    this.writeNL();\n    if (response.isCorrect) {\n      this.writeOPP();\n    } else {\n      this.writeOPM();\n    }\n    this.writeTextOrValue(response.response, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> feedbacks\n\n  protected between_feedbacks(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> feedbacks -> feedbacksValue -> reason\n\n  protected enter_reason(_node: NodeInfo, _route: NodeInfo[]): boolean {\n    this.writeCardSetSideDivider();\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> quizzes\n\n  protected enter_quizzes(_node: NodeInfo, _route: NodeInfo[]): void {\n    //\n  }\n\n  protected between_quizzes(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> heading\n\n  protected enter_heading(_node: NodeInfo, _route: NodeInfo[]): boolean | void {\n    //\n  }\n\n  protected between_heading(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    this.writeCardSetSideDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> heading -> forValues\n\n  protected enter_forValues(_node: NodeInfo, _route: NodeInfo[]): void {\n    //\n  }\n\n  protected between_forValues(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    this.writeCardSetSideDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> pairs\n\n  protected enter_pairs(_node: NodeInfo, _route: NodeInfo[]): void {\n    //\n  }\n\n  protected between_pairs(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> pairs -> pairsValue -> keyAudio\n\n  protected enter_keyAudio(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const resource = node.value as AudioResourceWrapperJson;\n\n    // This is a resource, so handle it with the common code\n    this.writeNL();\n    this.writeResource(ResourceType.audio, resource.audio.src);\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> pairs -> pairsValue -> keyImage\n\n  protected enter_keyImage(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const resource = node.value as ImageResourceWrapperJson;\n\n    // This is a resource, so handle it with the common code\n    this.writeNL();\n    this.writeResource(ResourceType.image, resource.image.src);\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> matrix\n\n  protected enter_matrix(_node: NodeInfo, _route: NodeInfo[]): void {\n    //\n  }\n\n  protected between_matrix(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> pairs -> pairsValue -> values\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> matrix -> matrixValue -> cells -> cellsValue -> values\n\n  protected enter_values(_node: NodeInfo, _route: NodeInfo[]): void {\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    this.writeCardSetSideDivider();\n  }\n\n  protected between_values(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    this.writeCardSetVariantDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> pronunciationTable\n\n  protected between_pronunciationTable(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    route: NodeInfo[],\n  ): void {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.cardNode) return;\n\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> table\n\n  protected enter_table(node: NodeInfo, route: NodeInfo[]): boolean | void {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.cardNode) return true;\n\n    const table = node.value as TableJson | TableExtendedJson | undefined;\n    if (!table) return true;\n\n    if (this.writeAdvancedTable(table)) {\n      return false;\n    }\n\n    return true;\n  }\n\n  protected between_table(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    route: NodeInfo[],\n  ): void {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.cardNode) return;\n\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    this.writeCardSetCardDivider();\n  }\n\n  private writeAdvancedTable(table: TableJson | TableExtendedJson): boolean {\n    const normalized = normalizeTableFormat(BitType.tableExtended, table) as TableExtendedJson;\n\n    const sections: Array<{\n      key: TableSectionKey;\n      qualifier?: string;\n      section?: TableSectionJson;\n    }> = [\n      { key: 'header', qualifier: 'table-header', section: normalized.header },\n      { key: 'body', qualifier: undefined, section: normalized.body },\n      { key: 'footer', qualifier: 'table-footer', section: normalized.footer },\n    ];\n\n    let rowCount = 0;\n\n    for (const { key, qualifier, section } of sections) {\n      const rows = section?.rows ?? [];\n\n      if (rows.length === 0) {\n        continue;\n      }\n\n      for (const row of rows) {\n        this.writeCardSetCardDivider(qualifier);\n        this.writeTableRow(row, key);\n        rowCount++;\n      }\n    }\n\n    return rowCount > 0;\n  }\n\n  private writeTableRow(row: TableRowJson, section: TableSectionKey): void {\n    const cells = row?.cells ?? [];\n    if (cells.length === 0) return;\n\n    for (let index = 0; index < cells.length; index++) {\n      if (index > 0) {\n        this.writeCardSetSideDivider();\n      }\n      this.writeNL();\n      this.writeTableCell(cells[index], section);\n    }\n  }\n\n  private writeTableCell(cell: TableCellJson, section: TableSectionKey): void {\n    const defaultCellType = section === 'body' ? 'td' : 'th';\n    const cellType = cell.title ? 'th' : 'td';\n\n    if (cellType !== defaultCellType) {\n      this.writeTableCellProperty('tableCellType', cellType);\n      this.writeNL();\n    }\n\n    if (cell.rowspan && cell.rowspan > 1) {\n      this.writeTableCellProperty('tableRowSpan', cell.rowspan);\n      this.writeNL();\n    }\n\n    if (cell.colspan && cell.colspan > 1) {\n      this.writeTableCellProperty('tableColSpan', cell.colspan);\n      this.writeNL();\n    }\n\n    if (cell.scope) {\n      this.writeTableCellProperty('tableScope', cell.scope);\n      this.writeNL();\n    }\n\n    if (cell.colwidth && cell.colwidth > 0) {\n      this.writeTableCellProperty('tableColWidth', cell.colwidth);\n      this.writeNL();\n    }\n\n    const content = cell.content ?? Breakscape.EMPTY_STRING;\n    const options = this.options.noBreakscaping ? { noBreakscaping: true } : undefined;\n    this.writeTextOrValue(content, this.textFormat, TextLocation.body, options);\n  }\n\n  private writeTableCellProperty(name: string, value: string | number): void {\n    this.writeOPA();\n    this.writeTagKey(name);\n    this.writeColon();\n    this.writeTextOrValue(`${value}`, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> table -> data\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> pronunciationTable -> data\n\n  protected between_data(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    route: NodeInfo[],\n  ): void {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.table && parent?.key !== NodeType.pronunciationTable) return;\n\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> table -> columns\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> captionDefinitionList -> columns\n\n  protected between_columns(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    route: NodeInfo[],\n  ): void {\n    const parent = this.getParentNode(route);\n    const parentKey = parent?.key;\n    if (parentKey !== NodeType.table && parentKey !== NodeType.captionDefinitionList) return;\n\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    this.writeCardSetSideDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> table -> columns -> columnsValue\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> captionDefinitionList -> columns -> columnsValue\n\n  protected leaf_columnsValue(node: NodeInfo, _route: NodeInfo[]): void {\n    this.writeNL();\n    this.writeOPHASH();\n    this.writeTextOrValue(node.value, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n  }\n\n  protected enter_columnsValue(node: NodeInfo, _route: NodeInfo[]): void {\n    this.writeNL();\n    this.writeOPHASH();\n    this.writeTextOrValue(node.value, TextFormat.bitmarkText, TextLocation.tag);\n    this.writeCL();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> table -> data -> dataValue\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> pronunciationTable -> data -> dataValue\n\n  protected between_dataValue(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    route: NodeInfo[],\n  ): void {\n    const parent = this.getParentNode(route, 2);\n    if (parent?.key !== NodeType.table && parent?.key !== NodeType.pronunciationTable) return;\n\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    this.writeCardSetSideDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> table -> data -> dataValue -> dataValueValue\n\n  protected leaf_dataValueValue(node: NodeInfo, route: NodeInfo[]): void {\n    const parent = this.getParentNode(route, 3);\n    if (parent?.key !== NodeType.table) return;\n\n    this.writeNL();\n    this.writeTextOrValue(node.value, this.textFormat, TextLocation.body);\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> table -> data -> dataValue -> dataValueValue\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> pronunciationTable -> data -> dataValue -> dataValueValue\n\n  protected enter_dataValueValue(node: NodeInfo, route: NodeInfo[]): void | boolean {\n    const parent = this.getParentNode(route, 3);\n    if (parent?.key !== NodeType.table && parent?.key !== NodeType.pronunciationTable) return;\n\n    if (node.value) {\n      if (parent?.key === NodeType.pronunciationTable) {\n        // Pronunciation Table\n        const cell = node.value as PronunciationTableCellJson;\n        if (cell.title) {\n          this.writeNL();\n          this.writeOP();\n          this.writeHash();\n          this.writeTextOrValue(cell.title, TextFormat.bitmarkText, TextLocation.tag);\n          this.writeCL();\n        }\n        if (cell.audio) {\n          this.writeNL();\n          this.writeResource(ResourceType.audio, cell.audio.audio.src);\n        }\n        if (cell.body) {\n          this.writeNL();\n          this.writeTextOrValue(cell.body, this.textFormat, TextLocation.body);\n        }\n\n        // Stop traversal of this branch\n        return false;\n      } else {\n        // Table\n        this.writeNL();\n        this.writeTextOrValue(node.value, this.textFormat, TextLocation.body);\n      }\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> captionDefinitionList\n\n  protected between_captionDefinitionList(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    route: NodeInfo[],\n  ): void {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.cardNode) return;\n\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> captionDefinitionList -> definitions -> definitionsValue -> term\n\n  protected leaf_term(node: NodeInfo, route: NodeInfo[]): boolean {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.definitionsValue) return true;\n\n    if (node.value) {\n      this.writeNL();\n      this.writeTextOrValue(node.value, this.textFormat, TextLocation.body);\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> captionDefinitionList -> definitions -> definitionsValue -> definition\n\n  protected leaf_definition(node: NodeInfo, route: NodeInfo[]): boolean {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.definitionsValue) return true;\n\n    if (node.value) {\n      this.writeNL();\n      this.writeTextOrValue(node.value, this.textFormat, TextLocation.body);\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> captionDefinitionList -> definitions\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> definitions\n\n  protected between_definitions(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    route: NodeInfo[],\n  ): void {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.cardNode && parent?.key !== NodeType.captionDefinitionList) return;\n\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> definitions -> definitionsValue\n\n  protected between_definitionsValue(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    right: NodeInfo,\n    route: NodeInfo[],\n  ): void {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.definitions) return;\n\n    // Ignore cards if not allowed\n    if (!this.isCardAllowed) return;\n\n    if (right.key === NodeType.definition) {\n      this.writeCardSetSideDivider();\n    } else if (right.key === NodeType.alternativeDefinitions && right.value?.length > 0) {\n      this.writeCardSetVariantDivider();\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> questions\n\n  protected enter_questions(_node: NodeInfo, _route: NodeInfo[]): void {\n    //\n  }\n\n  protected between_questions(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> ingredients\n\n  protected enter_ingredients(_node: NodeInfo, _route: NodeInfo[]): void {\n    //\n  }\n\n  protected between_ingredients(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> ingredients -> ingredientsValue\n\n  protected enter_ingredientsValue(node: NodeInfo, route: NodeInfo[]): boolean {\n    const ingredient = node.value as IngredientJson;\n\n    if (ingredient.title != null) {\n      this.writeNL();\n      this.writeOPHASH();\n      this.writeTextOrValue(ingredient.title, TextFormat.bitmarkText, TextLocation.tag);\n      this.writeCL();\n      // this.writeNL();\n    }\n\n    if (ingredient.ingredient != null) {\n      this.writeNL();\n\n      // [+] / [-]\n      if (ingredient.checked) {\n        this.writeOPP();\n      } else {\n        this.writeOPM();\n      }\n      this.writeCL();\n\n      // [!43]\n      if (ingredient.quantity != null) {\n        this.writeOPB();\n        this.writeTextOrValue(`${ingredient.quantity}`, TextFormat.plainText, TextLocation.tag);\n        this.writeCL();\n      }\n\n      // [@unit:kilograms]\n      if (ingredient.unit != null)\n        this.writeProperty('unit', ingredient.unit, route, {\n          format: TagFormat.plainText,\n        });\n\n      // [@unitPlural:kilograms]\n      if (ingredient.unitPlural != null)\n        this.writeProperty('unitPlural', ingredient.unitPlural, route, {\n          format: TagFormat.plainText,\n        });\n\n      // [@unitAbbr:kg]\n      if (ingredient.unitAbbr != null)\n        this.writeProperty('unitAbbr', ingredient.unitAbbr, route, {\n          format: TagFormat.plainText,\n        });\n\n      // [@unitAbbrPlural:kg]\n      if (ingredient.unitAbbrPlural != null)\n        this.writeProperty('unitAbbrPlural', ingredient.unitAbbrPlural, route, {\n          format: TagFormat.plainText,\n        });\n\n      // [@decimalPlaces:1]\n      if (ingredient.decimalPlaces != null)\n        this.writeProperty('decimalPlaces', ingredient.decimalPlaces, route, {\n          format: TagFormat.plainText,\n        });\n\n      // [@disableCalculation]\n      if (ingredient.disableCalculation)\n        this.writeProperty('disableCalculation', true, route, {\n          format: TagFormat.plainText,\n        });\n\n      // item\n\n      this.writeNL();\n      this.writeTextOrValue(ingredient.ingredient, this.textFormat, TextLocation.body);\n    }\n\n    // Continue traversal of this branch (item, lead, etc)\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> botResponses\n\n  protected enter_botResponses(_node: NodeInfo, _route: NodeInfo[]): void {\n    //\n  }\n\n  protected between_botResponses(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> cardBits\n\n  protected enter_cardBits(_node: NodeInfo, _route: NodeInfo[]): void {\n    //\n  }\n\n  protected between_cardBits(\n    _node: NodeInfo,\n    _left: NodeInfo,\n    _right: NodeInfo,\n    _route: NodeInfo[],\n  ): void {\n    this.writeCardSetCardDivider();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> botResponses -> botResponsesValue -> item\n\n  protected leaf_item(node: NodeInfo, route: NodeInfo[]): void {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.botResponsesValue) return;\n\n    this.writeNL();\n    this.writeOPC();\n    this.writeTextOrValue(node.value, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> botResponses -> botResponsesValue -> response\n\n  protected leaf_response(node: NodeInfo, route: NodeInfo[]): void {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.botResponsesValue) return;\n\n    this.writeNL();\n    this.writeOPB();\n    this.writeTextOrValue(node.value, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> botResponses -> botResponsesValue -> reaction\n\n  protected leaf_reaction(node: NodeInfo, route: NodeInfo[]): void {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.botResponsesValue) return;\n\n    this.writeNL();\n    this.writeProperty('reaction', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> botResponses -> botResponsesValue -> feedback\n\n  protected leaf_feedback(node: NodeInfo, route: NodeInfo[]): void {\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.botResponsesValue) return;\n\n    const feedback = node.value as string;\n    if (feedback) {\n      this.writeNL();\n      this.writeTextOrValue(feedback, this.textFormat, TextLocation.body);\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> backgroundWallpaper\n  protected enter_backgroundWallpaper(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const resource = node.value as ResourceJson;\n\n    // This is a resource, so handle it with the common code\n    this.writeNL();\n    this.writePropertyStyleResource(node.key, resource);\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> imagePlaceholder\n  protected enter_imagePlaceholder(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const resource = node.value as ResourceJson;\n\n    // This is a resource, so handle it with the common code\n    this.writeNL();\n    this.writePropertyStyleResource(node.key, resource);\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> previewImageValue\n  protected enter_previewImageValue(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const resource = node.value as ResourceJson;\n\n    // This is a resource, so handle it with the common code\n    this.writeNL();\n    this.writePropertyStyleResource('previewImage', resource);\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> previewVideoValue\n  protected enter_previewVideoValue(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const resource = node.value as ResourceJson;\n\n    // This is a resource, so handle it with the common code\n    this.writeNL();\n    this.writePropertyStyleResource('previewVideo', resource);\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> platformIcon\n  protected enter_platformIcon(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const resource = node.value as ResourceJson;\n\n    // This is a resource, so handle it with the common code\n    this.writeNL();\n    this.writePropertyStyleResource(node.key, resource);\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> platformLogo\n  protected enter_platformLogo(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const resource = node.value as ResourceJson;\n\n    // This is a resource, so handle it with the common code\n    this.writeNL();\n    this.writePropertyStyleResource(node.key, resource);\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> platformBackgroundImage\n  protected enter_platformBackgroundImage(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const resource = node.value as ResourceJson;\n\n    // This is a resource, so handle it with the common code\n    this.writeNL();\n    this.writePropertyStyleResource(node.key, resource);\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> coverImage (when it's a resource object or property array)\n  protected enter_coverImage(node: NodeInfo, route: NodeInfo[]): boolean {\n    const value = node.value;\n\n    // Check if this is a resource (object with 'type' field and not an array) or a property array\n    if (value && typeof value === 'object' && !Array.isArray(value) && 'type' in value) {\n      // This is a resource\n      const resource = value as ResourceJson;\n\n      // This is a resource, so handle it with the common code\n      this.writeNL();\n      this.writePropertyStyleResource(node.key, resource);\n\n      // Continue traversal\n      return true;\n    }\n\n    // If it's an array (property), handle it like a property\n    if (Array.isArray(value)) {\n      // This is a property array - use the standard property handling\n      if (value == null) return true;\n\n      // Ignore any property that is not at the bit level\n      const parent = this.getParentNode(route);\n      if (parent?.key !== NodeType.bitsValue) return true;\n\n      const bitType = this.getBitType(route);\n      if (!bitType) return true;\n\n      const config = Config.getBitConfig(bitType);\n      const propertyConfig = Config.getTagConfigForTag(\n        config.tags,\n        ConfigKey.property_coverImage,\n      ) as PropertyTagConfig | undefined;\n      if (!propertyConfig) return true;\n\n      // Write the property\n      this.writeNL_IfNotChain(route); // Only if NOT in chain\n      this.writeProperty(propertyConfig.tag, value, route, {\n        format: propertyConfig.format ?? TagFormat.plainText,\n        array: propertyConfig.array ?? false,\n        writeEmpty: true,\n        ignoreFalse: propertyConfig.defaultValue === 'false',\n        ignoreTrue: propertyConfig.defaultValue === 'true',\n      });\n    }\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> coverImage (when it's a property string)\n  // This is called when coverImage is a simple string value\n  protected leaf_coverImage(node: NodeInfo, route: NodeInfo[]): void {\n    // This is a property - use the standard property handling\n    const value = node.value;\n    if (value == null) return;\n\n    // Ignore any property that is not at the bit level as that will be handled by a different handler\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return;\n\n    const bitType = this.getBitType(route);\n    if (!bitType) return;\n\n    const config = Config.getBitConfig(bitType);\n    const propertyConfig = Config.getTagConfigForTag(config.tags, ConfigKey.property_coverImage) as\n      PropertyTagConfig | undefined;\n    if (!propertyConfig) return;\n\n    // Write the property\n    this.writeNL_IfNotChain(route); // Only if NOT in chain\n    this.writeProperty(propertyConfig.tag, node.value, route, {\n      format: propertyConfig.format ?? TagFormat.plainText,\n      array: propertyConfig.array ?? false,\n      writeEmpty: true,\n      ignoreFalse: propertyConfig.defaultValue === 'false',\n      ignoreTrue: propertyConfig.defaultValue === 'true',\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> backgroundImage (when it's a resource object or property array)\n  protected enter_backgroundImage(node: NodeInfo, route: NodeInfo[]): boolean {\n    const value = node.value;\n\n    // Check if this is a resource (object with 'type' field and not an array) or a property array\n    if (value && typeof value === 'object' && !Array.isArray(value) && 'type' in value) {\n      // This is a resource\n      const resource = value as ResourceJson;\n\n      // This is a resource, so handle it with the common code\n      this.writeNL();\n      this.writePropertyStyleResource(node.key, resource);\n\n      // Continue traversal\n      return true;\n    }\n\n    // If it's an array (property), handle it like a property\n    if (Array.isArray(value)) {\n      // This is a property array - use the standard property handling\n      if (value == null) return true;\n\n      // Ignore any property that is not at the bit level\n      const parent = this.getParentNode(route);\n      if (parent?.key !== NodeType.bitsValue) return true;\n\n      const bitType = this.getBitType(route);\n      if (!bitType) return true;\n\n      const config = Config.getBitConfig(bitType);\n      const propertyConfig = Config.getTagConfigForTag(\n        config.tags,\n        ConfigKey.property_backgroundImage,\n      ) as PropertyTagConfig | undefined;\n      if (!propertyConfig) return true;\n\n      // Write the property\n      this.writeNL_IfNotChain(route); // Only if NOT in chain\n      this.writeProperty(propertyConfig.tag, value, route, {\n        format: propertyConfig.format ?? TagFormat.plainText,\n        array: propertyConfig.array ?? false,\n        writeEmpty: true,\n        ignoreFalse: propertyConfig.defaultValue === 'false',\n        ignoreTrue: propertyConfig.defaultValue === 'true',\n      });\n    }\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> backgroundImage (when it's a property string)\n  // This is called when backgroundImage is a simple string value\n  protected leaf_backgroundImage(node: NodeInfo, route: NodeInfo[]): void {\n    // This is a property - use the standard property handling\n    const value = node.value;\n    if (value == null) return;\n\n    // Ignore any property that is not at the bit level as that will be handled by a different handler\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return;\n\n    const bitType = this.getBitType(route);\n    if (!bitType) return;\n\n    const config = Config.getBitConfig(bitType);\n    const propertyConfig = Config.getTagConfigForTag(\n      config.tags,\n      ConfigKey.property_backgroundImage,\n    ) as PropertyTagConfig | undefined;\n    if (!propertyConfig) return;\n\n    // Write the property\n    this.writeNL_IfNotChain(route); // Only if NOT in chain\n    this.writeProperty(propertyConfig.tag, node.value, route, {\n      format: propertyConfig.format ?? TagFormat.plainText,\n      array: propertyConfig.array ?? false,\n      writeEmpty: true,\n      ignoreFalse: propertyConfig.defaultValue === 'false',\n      ignoreTrue: propertyConfig.defaultValue === 'true',\n    });\n  }\n\n  protected exit_imagePlaceholder(_node: NodeInfo, _route: NodeInfo[]): void {\n    // this.writeNL();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> posterImage\n  // bitmarkAst -> bits -> bitsValue -> resource -> * -> posterImage\n\n  protected enter_posterImage(node: NodeInfo, route: NodeInfo[]): boolean {\n    const parent = this.getParentNode(route);\n    if (parent?.key === NodeType.bitsValue) {\n      // Bit poster image\n      const posterImage = node.value as string;\n      if (posterImage) {\n        this.writeProperty('posterImage', posterImage, route, {\n          format: TagFormat.plainText,\n        });\n      }\n    } else {\n      // Resource poster image\n      const posterImage = node.value as ImageResourceJson;\n      if (posterImage && posterImage.src) {\n        this.writeProperty('posterImage', posterImage.src, route, {\n          format: TagFormat.plainText,\n        });\n      }\n    }\n\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> resource -> thumbnails\n  // [src1x,src2x,src3x,src4x,width,height,alt,zoomDisabled,caption]\n\n  protected enter_thumbnails(node: NodeInfo, route: NodeInfo[]): boolean {\n    const thumbnails = node.value as ImageResourceJson[];\n\n    if (Array.isArray(thumbnails)) {\n      const thumbnailKeys = ['src1x', 'src2x', 'src3x', 'src4x'];\n\n      for (let i = 0; i < thumbnails.length; i++) {\n        // Can only handle 4 thumbnails\n        if (i === thumbnailKeys.length) break;\n        const thumbnail = thumbnails[i];\n        const key = thumbnailKeys[i];\n        this.writeProperty(key, thumbnail.src, route, {\n          format: TagFormat.plainText,\n        });\n      }\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> bitType\n\n  // bitmarkAst -> bits -> bitsValue -> textFormat\n\n  //  bitmarkAst -> bits -> level\n\n  protected leaf_level(node: NodeInfo, route: NodeInfo[]): boolean {\n    // Ensure this is at the bit level\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    // Ensure this is a chapter bit\n    if (!Config.isOfBitType(this.bitType, [BitType.chapter])) return true;\n\n    const level = node.value as number;\n    const bit = parent?.value as Bit;\n\n    if (level > 0 && bit.title == null) {\n      // If the level is set, but there is no title, this is a [.chapter] bit with an empty title.\n      // We need to write an empty title tag at the correct level.\n      this.writeNL();\n      this.writeOP();\n      for (let i = 0; i < +level; i++) this.writeHash();\n      this.writeCL();\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> titleString\n\n  protected leaf_titleString(node: NodeInfo, route: NodeInfo[]): boolean {\n    // Ignore title that are not at the bit level as they are handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    if (node.value) {\n      this.writeNL();\n      // this.bitJson.title = node.value;\n      this.writeProperty('title', node.value, route, {\n        format: TagFormat.plainText,\n      });\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  //  bitmarkAst -> bits -> title\n\n  protected enter_title(node: NodeInfo, route: NodeInfo[]): boolean {\n    // Ensure this is at the bit level\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    const value = node.value as TextAst;\n    const title = value;\n    const bit = parent?.value as Bit;\n    const level = bit.level || 1;\n\n    if (level && title) {\n      this.writeNL();\n      this.writeOP();\n      for (let i = 0; i < +level; i++) this.writeHash();\n      this.writeTextOrValue(title, TextFormat.bitmarkText, TextLocation.tag);\n      this.writeCL();\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  //  bitmarkAst -> bits -> subtitle\n\n  protected enter_subtitle(node: NodeInfo, route: NodeInfo[]): boolean {\n    // Ensure this is at the bit level\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    const value = node.value as TextAst;\n    const subtitle = value;\n    const level = 2;\n    if (level && subtitle) {\n      this.writeNL();\n      this.writeOP();\n      for (let i = 0; i < level; i++) this.writeHash();\n      this.writeTextOrValue(subtitle, TextFormat.bitmarkText, TextLocation.tag);\n      this.writeCL();\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> book (array)\n  // bitmarkAst -> bits -> bitsValue -> book (array) -> bookValue\n\n  protected enter_book(_node: NodeInfo, _route: NodeInfo[]): void {\n    // Block standard property handling\n  }\n\n  protected enter_bookValue(node: NodeInfo, route: NodeInfo[]): boolean {\n    const book = node.value as BookJson;\n    // const parent = this.getParentNode(route);\n    // const bit = parent?.value as Bit;\n\n    if (book) {\n      this.writeNL();\n      this.writeProperty('book', book.book, route, {\n        format: TagFormat.plainText,\n        writeEmpty: true,\n      });\n      if (book.reference) {\n        this.writeOPRANGLE();\n        this.writeTextOrValue(book.reference, TextFormat.plainText, TextLocation.tag);\n        this.writeCL();\n\n        if (book.referenceEnd) {\n          this.writeOPRANGLE();\n          this.writeTextOrValue(book.referenceEnd, TextFormat.plainText, TextLocation.tag);\n          this.writeCL();\n        }\n      }\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> book (single)\n\n  protected leaf_book(node: NodeInfo, route: NodeInfo[]): void {\n    const parent = this.getParentNode(route);\n    const bit = parent?.value as Bit;\n\n    if (bit && node.value) {\n      this.writeNL();\n      this.writeProperty('book', node.value, route, {\n        format: TagFormat.plainText,\n        writeEmpty: true,\n      });\n      if (bit.reference) {\n        this.writeOPRANGLE();\n        this.writeTextOrValue(bit.reference, TextFormat.plainText, TextLocation.tag);\n        this.writeCL();\n\n        if (bit.referenceEnd) {\n          this.writeOPRANGLE();\n          this.writeTextOrValue(bit.referenceEnd, TextFormat.plainText, TextLocation.tag);\n          this.writeCL();\n        }\n      }\n    }\n  }\n\n  //  bitmarkAst -> bits -> bitsValue -> anchor\n\n  protected leaf_anchor(node: NodeInfo, _route: NodeInfo[]): void {\n    if (node.value) {\n      this.writeNL();\n      this.writeOPDANGLE();\n      this.writeTextOrValue(node.value, TextFormat.plainText, TextLocation.tag);\n      this.writeCL();\n    }\n  }\n\n  //  bitmarkAst -> bits -> bitsValue -> reference\n\n  protected leaf_reference(node: NodeInfo, route: NodeInfo[]): void {\n    const parent = this.getParentNode(route);\n    const bit = parent?.value as Bit;\n\n    if (bit && node.value) {\n      // Only write reference if it is not chained to 'book'\n      if (!bit.book) {\n        this.writeNL();\n        this.writeOPRANGLE();\n        this.writeTextOrValue(node.value, TextFormat.plainText, TextLocation.tag);\n        this.writeCL();\n      }\n    }\n  }\n\n  //  * -> itemLead --> item\n\n  //  * -> itemLead --> lead\n\n  //  * -> hint\n\n  protected enter_hint(node: NodeInfo, route: NodeInfo[]): boolean {\n    const value = node.value as TextAst;\n    const text = value;\n    if (!this.isEmptyText(text)) {\n      this.writeNL_IfNotChain(route);\n      this.writeOPQ();\n      this.writeTextOrValue(text, TextFormat.bitmarkText, TextLocation.tag);\n      this.writeCL();\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue ->  * -> instruction\n\n  protected enter_instruction(node: NodeInfo, route: NodeInfo[]): boolean {\n    const value = node.value as TextAst;\n    const text = value;\n    if (!this.isEmptyText(text)) {\n      this.writeNL_IfNotChain(route);\n      this.writeOPB();\n      this.writeTextOrValue(text, TextFormat.bitmarkText, TextLocation.tag);\n      this.writeCL();\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue ->  * -> lang\n\n  protected leaf_lang(node: NodeInfo, route: NodeInfo[]): void {\n    if (!node.value) return;\n\n    // this.writeNL();\n    this.writeProperty('lang', node.value, route, {\n      format: TagFormat.boolean,\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue ->  * -> refAuthor\n\n  protected enter_refAuthor(node: NodeInfo, route: NodeInfo[]): void {\n    if (!node.value) return;\n\n    // this.writeNL();\n    this.writeProperty('refAuthor', node.value, route, {\n      format: TagFormat.plainText,\n      array: true,\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue ->  * -> refBookTitle\n\n  protected leaf_refBookTitle(node: NodeInfo, route: NodeInfo[]): void {\n    if (!node.value) return;\n\n    // this.writeNL();\n    this.writeProperty('refBookTitle', node.value, route, {\n      format: TagFormat.plainText,\n      array: true,\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue ->  * -> refPublisher\n\n  protected enter_refPublisher(node: NodeInfo, route: NodeInfo[]): void {\n    if (!node.value) return;\n\n    // this.writeNL();\n    this.writeProperty('refPublisher', node.value, route, {\n      format: TagFormat.plainText,\n      array: true,\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue ->  * -> refPublicationYear\n\n  protected leaf_refPublicationYear(node: NodeInfo, route: NodeInfo[]): void {\n    if (!node.value) return;\n\n    // this.writeNL();\n    this.writeProperty('refPublicationYear', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue ->  * -> citationStyle\n\n  protected leaf_citationStyle(node: NodeInfo, route: NodeInfo[]): void {\n    if (!node.value) return;\n\n    // this.writeNL();\n    this.writeProperty('citationStyle', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue ->  * -> isExample / example\n\n  protected leaf_isExample(node: NodeInfo, route: NodeInfo[]): void {\n    const isExample = node.value as boolean | undefined;\n    if (!isExample) return;\n\n    const parent = this.getParentNode(route);\n    const example = parent?.value.example ?? null;\n    // const __isDefaultExample = parent?.value.__isDefaultExample ?? false;\n\n    if (example != null && example !== '') {\n      // Write a newline if not in a chain\n      this.writeNL_IfNotChain(route);\n\n      this.writeOPA();\n      this.writeString('example');\n      this.writeColon();\n\n      if (example === true) {\n        this.writeString(' true ');\n      } else if (example === false) {\n        this.writeString(' false ');\n      } else if (Array.isArray(example)) {\n        // TextAst\n        this.writeTextOrValue(example, TextFormat.bitmarkText, TextLocation.tag);\n      } else {\n        // String\n        this.writeTextOrValue(example, TextFormat.plainText, TextLocation.tag);\n      }\n      this.writeCL();\n    } else {\n      // Don't write example if it is null.\n      // this.writeOPA();\n      // this.writeString('example');\n      // this.writeCL();\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> elements -> elementsValue\n\n  protected enter_elementsValue(node: NodeInfo, _route: NodeInfo[]): boolean {\n    if (node.value) {\n      this.writeNL();\n      this.writeTextOrValue(node.value, this.textFormat, TextLocation.body);\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> body -> bodyValue -> gap -> solutions -> solution\n  // ? -> solutions -> solution\n\n  protected leaf_solutionsValue(node: NodeInfo, route: NodeInfo[]): void {\n    const parent = this.getParentNode(route, 2);\n    if (parent?.key !== NodeType.bitsValue) return;\n\n    if (node.value != null) {\n      this.writeOPU();\n      this.writeTextOrValue(node.value, TextFormat.plainText, TextLocation.tag);\n      this.writeCL();\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue-> body -> bodyValue -> select -> options -> prefix\n  // bitmarkAst -> bits -> bitsValue-> body -> bodyValue -> highlight -> options -> prefix\n\n  protected leaf_prefix(node: NodeInfo, _route: NodeInfo[]): void {\n    if (node.value) {\n      this.writeOPPRE();\n      this.writeTextOrValue(node.value, TextFormat.plainText, TextLocation.tag);\n      this.writeCL();\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue-> body -> bodyValue -> select -> options -> postfix\n  // bitmarkAst -> bits -> bitsValue-> body -> bodyValue -> highlight -> options -> postfix\n\n  protected leaf_postfix(node: NodeInfo, _route: NodeInfo[]): void {\n    if (node.value) {\n      this.writeOPPOST();\n      this.writeTextOrValue(node.value, TextFormat.plainText, TextLocation.tag);\n      this.writeCL();\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue ->  * -> isCaseSensitive\n\n  protected leaf_isCaseSensitive(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('isCaseSensitive', node.value, route, {\n      format: TagFormat.boolean,\n      writeEmpty: true,\n      ignoreFalse: false,\n      ignoreTrue: true,\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue ->  * -> isCorrect\n\n  // bitmarkAst -> bits -> bitsValue -> heading -> forKeys\n\n  protected leaf_forKeys(node: NodeInfo, _route: NodeInfo[]): void {\n    this.writeNL();\n    this.writeOPHASH();\n    this.writeTextOrValue(node.value, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> heading -> forValues\n\n  protected leaf_forValues(node: NodeInfo, _route: NodeInfo[]): void {\n    this.writeNL();\n    this.writeOPHASH();\n    this.writeTextOrValue(node.value, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> heading -> forValuesValue\n\n  protected leaf_forValuesValue(node: NodeInfo, _route: NodeInfo[]): void {\n    this.writeNL();\n    this.writeOPHASH();\n    this.writeTextOrValue(node.value, TextFormat.plainText, TextLocation.tag);\n    this.writeCL();\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> pairs -> pairsValue -> key\n  // bitmarkAst -> bits -> bitsValue -> matrix -> matrixValue -> key\n\n  protected leaf_key(node: NodeInfo, _route: NodeInfo[]): void {\n    if (node.value) {\n      this.writeNL();\n      this.writeTextOrValue(node.value, this.textFormat, TextLocation.body);\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> pairs -> pairsValue -> values -> valuesValue\n  // bitmarkAst -> bits -> bitsValue -> matrix -> matrixValue -> cells -> cellsValue -> values -> valuesValue\n\n  protected leaf_valuesValue(node: NodeInfo, _route: NodeInfo[]): void {\n    if (node.value) {\n      this.writeNL();\n      this.writeTextOrValue(node.value, this.textFormat, TextLocation.body);\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> questions -> questionsValue -> question\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> questions -> questionsValue -> question\n\n  protected enter_question(node: NodeInfo, route: NodeInfo[]): boolean {\n    // Ignore responses that are not at the questionsValue level as they are handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.questionsValue) return true;\n\n    if (node.value) {\n      this.writeNL();\n      this.writeTextOrValue(node.value, this.textFormat, TextLocation.body);\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> flashcards -> flashcardsValue -> question\n\n  protected leaf_question(node: NodeInfo, route: NodeInfo[]): void {\n    // Ignore responses that are not at the questionsValue level as they are handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.flashcardsValue) return;\n\n    if (node.value) {\n      this.writeNL();\n      this.writeTextOrValue(node.value, this.textFormat, TextLocation.body);\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> statements -> text\n\n  // bitmarkAst -> bits -> bitsValue -> resource -> ...\n  // bitmarkAst -> bits -> bitsValue -> resource -> posterImage -> ...\n  // bitmarkAst -> bits -> bitsValue -> resource -> thumbnails -> thumbnailsValue -> ...\n  // [srcAlt,src1x,src2x,src3x,src4x,width,height,alt,zoomDisabled,caption]\n\n  protected leaf_srcAltValue(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('srcAlt', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  protected leaf_src1x(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('src1x', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  protected leaf_src2x(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('src2x', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  protected leaf_src3x(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('src3x', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  protected leaf_src4x(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('src4x', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  protected leaf_width(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('width', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  protected leaf_height(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('height', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  protected leaf_alt(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('alt', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  protected leaf_zoomDisabled(node: NodeInfo, route: NodeInfo[]): void {\n    // if (this.isInlineImageTag(route)) return; // inline images render their own chain\n\n    if (\n      Config.isOfBitType(this.bitType, [\n        BitType.imageSeparator,\n        BitType.pageBanner,\n        BitType.imagesLogoGrave,\n        BitType.prototypeImages,\n        BitType.extractorImage,\n      ])\n    ) {\n      this.writeProperty('zoomDisabled', node.value, route, {\n        format: TagFormat.boolean,\n        writeEmpty: true,\n        ignoreFalse: false,\n        ignoreTrue: true,\n      });\n    } else {\n      this.writeProperty('zoomDisabled', node.value, route, {\n        format: TagFormat.boolean,\n        writeEmpty: true,\n        ignoreFalse: true,\n        ignoreTrue: false,\n      });\n    }\n  }\n\n  protected leaf_license(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('license', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  protected leaf_copyright(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('copyright', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  protected leaf_provider(_node: NodeInfo, _route: NodeInfo[]): void {\n    // provider is included in the url (it is the domain) and should not be written as a property\n    // this.writeProperty('provider', node.value);\n  }\n\n  protected leaf_showInIndex(node: NodeInfo, route: NodeInfo[]): void {\n    if (node.value == null) return;\n\n    this.writeNL_IfNotChain(route);\n    this.writeProperty('showInIndex', node.value, route, {\n      format: TagFormat.boolean,\n      ignoreFalse: true,\n    });\n  }\n\n  protected enter_caption(node: NodeInfo, route: NodeInfo[]): boolean {\n    const value = node.value as string;\n\n    this.writeNL_IfNotChain(route);\n    this.writeProperty('caption', value, route, {\n      format: TagFormat.bitmarkText,\n    });\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  protected leaf_search(node: NodeInfo, route: NodeInfo[]): void {\n    const value = node.value as string;\n\n    if (!value) return;\n\n    this.writeNL_IfNotChain(route);\n    this.writeProperty('search', value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  protected leaf_selected(node: NodeInfo, route: NodeInfo[]): void {\n    if (node.value == null) return;\n\n    this.writeNL_IfNotChain(route);\n    this.writeProperty('selected', node.value, route, {\n      format: TagFormat.boolean,\n      ignoreFalse: true,\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> resource -> ...\n  // bitmarkAst -> bits -> bitsValue -> resource -> posterImage -> ...\n  // bitmarkAst -> bits -> bitsValue -> resource -> thumbnails -> thumbnailsValue -> ...\n  // [duration,mute,autoplay,allowSubtitles,showSubtitles]\n\n  protected leaf_duration(node: NodeInfo, route: NodeInfo[]): void {\n    // If duration is at the bit level write a NL before the property, otherwise it is part of a chain\n    const parent = this.getParentNode(route);\n    if (parent?.key === NodeType.bitsValue) {\n      this.writeNL();\n    }\n\n    this.writeProperty('duration', node.value, route, {\n      format: TagFormat.plainText,\n    });\n  }\n\n  protected leaf_mute(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('mute', node.value, route, {\n      format: TagFormat.boolean,\n    });\n  }\n\n  protected leaf_autoplay(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('autoplay', node.value, route, {\n      format: TagFormat.boolean,\n    });\n  }\n\n  protected leaf_allowSubtitles(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('allowSubtitles', node.value, route, {\n      format: TagFormat.boolean,\n    });\n  }\n\n  protected leaf_showSubtitles(node: NodeInfo, route: NodeInfo[]): void {\n    this.writeProperty('showSubtitles', node.value, route, {\n      format: TagFormat.boolean,\n    });\n  }\n\n  //\n  // Resources\n  //\n\n  //\n  // Generated Node Handlers\n  //\n\n  /**\n   * Generate the handlers for resources, as they are mostly the same, but not quite\n   */\n\n  protected generateResourceHandlers() {\n    for (const tag of Enum(ResourceType).keys()) {\n      // skip unknown\n      if (tag === Enum(ResourceType).keyFromValue(ResourceType.unknown)) continue;\n\n      const enterFuncName = `enter_${tag}`;\n\n      // Skip if the function already exists, allows for custom handlers\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      if (typeof (this as any)[enterFuncName] === 'function') {\n        continue;\n      }\n\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      (this as any)[enterFuncName] = (node: NodeInfo, route: NodeInfo[]): boolean => {\n        const resource = node.value as ResourceDataJson | undefined;\n        if (resource == null) return false;\n\n        // Ignore any property that is not at the bit level as that will be handled by a different handler\n        const parent = this.getParentNode(route);\n        if (parent?.key !== NodeType.resourcesValue) return true;\n\n        // Get the resource alias\n        const alias = Enum(ResourceType).fromValue(parent?.value.__typeAlias);\n        const type = alias ?? Enum(ResourceType).fromValue(parent?.value.type);\n        if (!type) return false;\n\n        // url / src / href / app\n        const url = resource.url || resource.src || resource.body || '';\n\n        // Write the resource\n        this.writeNL();\n        this.writeResource(type, url);\n\n        // Continue traversal\n        return true;\n      };\n\n      // Bind this\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      (this as any)[enterFuncName] = (this as any)[enterFuncName].bind(this);\n    }\n\n    // for (const tag of ResourceTag.keys()) {\n    //   // skip unknown\n    //   if (tag === ResourceTag.keyFromValue(ResourceTag.unknown)) continue;\n\n    //   const enterFuncName = `enter_${tag}`;\n\n    //   // Skip if the function already exists, allows for custom handlers\n    //   // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    //   if (typeof (this as any)[enterFuncName] === 'function') {\n    //     continue;\n    //   }\n\n    //   // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    //   (this as any)[enterFuncName] = (node: NodeInfo, route: NodeInfo[]): boolean => {\n    //     const resource = node.value as ResourceDataJson | undefined;\n    //     if (resource == null) return false;\n\n    //     // Ignore any property that is not at the bit level as that will be handled by a different handler\n    //     const parent = this.getParentNode(route);\n    //     if (parent?.key !== NodeType.resourcesValue) return true;\n\n    //     // Get the resource alias\n    //     const alias = ResourceTag.fromValue(parent.value.__typeAlias);\n    //     const type = alias ?? ResourceTag.fromValue(parent.value.type);\n    //     if (!type) return false;\n\n    //     // url / src / href / app\n    //     const url = resource.url || resource.src || resource.body || '';\n\n    //     // Write the resource\n    //     this.writeNL();\n    //     this.writeResource(type, url);\n\n    //     // Continue traversal\n    //     return true;\n    //   };\n\n    //   // Bind this\n    //   // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    //   (this as any)[enterFuncName] = (this as any)[enterFuncName].bind(this);\n    // }\n  }\n\n  /**\n   * Generate the handlers for properties, as they are mostly the same, but not quite\n   */\n\n  protected generatePropertyHandlers() {\n    for (const propertyConfigKey of Enum(PropertyKey).values()) {\n      const propertyTag = configKeyToPropertyType(propertyConfigKey);\n\n      const funcNames = [`enter_${propertyTag}`, `leaf_${propertyTag}`];\n      for (const funcName of funcNames) {\n        // Skip if the function already exists, allows for custom handlers\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        if (typeof (this as any)[funcName] === 'function') {\n          continue;\n        }\n\n        // Skip 'example' property as it is non-standard and handled elsewhere\n        if (propertyTag === 'example') continue;\n\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        (this as any)[funcName] = (node: NodeInfo, route: NodeInfo[]) => {\n          const value = node.value as unknown[] | undefined;\n          if (value == null) return;\n\n          // Ignore any property that is not at the bit level as that will be handled by a different handler\n          const parent = this.getParentNode(route);\n          if (parent?.key !== NodeType.bitsValue) return;\n\n          const bitType = this.getBitType(route);\n          if (!bitType) return;\n\n          const config = Config.getBitConfig(bitType);\n          const propertyConfig = Config.getTagConfigForTag(config.tags, propertyConfigKey) as\n            PropertyTagConfig | undefined;\n          if (!propertyConfig) return;\n\n          // Write the property\n          // this.writeNL_IfNotChain(route); // Only if NOT in chain\n          this.writeProperty(propertyConfig.tag, node.value, route, {\n            format: propertyConfig.format ?? TagFormat.plainText,\n            array: propertyConfig.array ?? false,\n            writeEmpty: true,\n            ignoreFalse: propertyConfig.defaultValue === 'false',\n            ignoreTrue: propertyConfig.defaultValue === 'true',\n          });\n        };\n\n        // Bind this\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        (this as any)[funcName] = (this as any)[funcName].bind(this);\n      }\n    }\n\n    // const propertiesConfig = Config.getRawPropertiesConfig();\n\n    // for (const propertyConfig of Object.values(propertiesConfig)) {\n    //   const astKey = propertyConfig.astKey ?? propertyConfig.tag;\n\n    //   const enterFuncName = `enter_${astKey}`;\n\n    //   // Skip if the function already exists, allows for custom handlers\n    //   // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    //   if (typeof (this as any)[enterFuncName] === 'function') {\n    //     continue;\n    //   }\n\n    //   // Skip 'example' property as it is non-standard and handled elsewhere\n    //   if (astKey === 'example') continue;\n\n    //   // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    //   (this as any)[enterFuncName] = (node: NodeInfo, route: NodeInfo[]) => {\n    //     const value = node.value as unknown[] | undefined;\n    //     if (value == null) return;\n\n    //     // Ignore any property that is not at the bit level as that will be handled by a different handler\n    //     const parent = this.getParentNode(route);\n    //     if (parent?.key !== NodeType.bitsValue) return;\n\n    //     // Write the property\n    //     this.writeNL_IfNotChain(route); // Only if NOT in chain\n    //     this.writeProperty(propertyConfig.tag, node.value, {\n    //       format: propertyConfig.format ?? TagFormat.plainText,\n    //       single: propertyConfig.single ?? false,\n    //       writeEmpty: true,\n    //       ignoreFalse: propertyConfig.defaultValue === 'false',\n    //       ignoreTrue: propertyConfig.defaultValue === 'true',\n    //     });\n    //   };\n\n    //   // Bind this\n    //   // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    //   (this as any)[enterFuncName] = (this as any)[enterFuncName].bind(this);\n    // }\n  }\n\n  // END NODE HANDLERS\n\n  //\n  // UTILITY FUNCTIONS\n  //\n\n  /**\n   * Get the bit type from any node\n   *\n   * @param route the route to the current node\n   * @returns the bit type\n   */\n  protected getBitType(route: NodeInfo[]): BitTypeType | undefined {\n    for (const node of route) {\n      if (node.key === NodeType.bitsValue) {\n        const n = node.value as Bit;\n        return n?.bitType;\n      }\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Check if in a chain.\n   *\n   * Return false if at the root of the bit or a card bit, otherwise true.\n   * This is useful to determine if a newline should be written before certain properties.\n   *\n   * @param route\n   * @returns\n   */\n  protected isChain(route: NodeInfo[]): boolean {\n    const parent = this.getParentNode(route);\n    // Root of bit\n    if (parent?.key === NodeType.bitsValue) return false;\n\n    // Root of card bits\n    if (parent?.key === NodeType.cardBitsValue) return false;\n    if (parent?.key === NodeType.feedbacksValue) return false;\n    if (parent?.key === NodeType.quizzesValue) return false;\n    if (parent?.key === NodeType.pairsValue) return false;\n    if (parent?.key === NodeType.matrixValue) return false;\n    if (parent?.key === NodeType.definitionsValue) return false;\n    if (parent?.key === NodeType.questionsValue) return false;\n\n    // Root of sub-card bits\n    if (parent?.key === NodeType.reason) return false;\n\n    return true;\n  }\n\n  protected haveValidCardSet(bit: Bit): boolean {\n    const bitConfig = Config.getBitConfig(bit.bitType);\n    if (!bitConfig) return false;\n\n    // There is no easy way to determine if a card set is valid, so we will just check if the bit has a card set\n    // and if so, assume it is valid.\n\n    // This information is used for automatically generating the '==== text ====' divider, so this will not be\n    // generated for any bit that has a card set unless this function is improved, however, a bit that has a\n    // card set in the configuration does not make any sense without a card set, so this is a reasonable behaviour.\n\n    return !!bitConfig.cardSet;\n  }\n\n  protected haveValidFooter(bit: Bit): boolean {\n    const footer = bit.footer;\n    if (!footer) return false;\n    const textFormat = bit.textFormat;\n\n    // Handle footer\n    if (textFormat === TextFormat.json) {\n      // Json footer?!\n      // Not valid, ignore\n      return false;\n    } else if (footer.footer && footer.footer.length > 0) {\n      if (this.isBodyBitmarkText) {\n        // handle bitmark text\n        return true;\n      } else {\n        // Plain text footer?!\n        // Not valid, ignore (plain text cannot have a card set / footer marker, so cannot have a footer!\n        return false;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Calculate the number of spaces around values from the options.\n   *\n   * This function should only be called from the constructor.\n   * Otherwise use this.spacesAroundValues.\n   *\n   * @returns\n   */\n  protected calcSpacesAroundValues(): number {\n    const val = this.options.spacesAroundValues;\n    let spaces = DEFAULT_SPACES_AROUND_VALUES;\n    if (val != null) {\n      if (val === true) {\n        spaces = DEFAULT_SPACES_AROUND_VALUES;\n      } else if (val === false) {\n        spaces = 0;\n      } else {\n        spaces = val;\n      }\n    }\n    spaces = Math.min(Math.max(spaces, 0), MAX_SPACES_AROUND_VALUES);\n\n    return spaces;\n  }\n\n  // END UTILITY FUNCTIONS\n\n  //\n  // WRITE FUNCTIONS\n  //\n\n  /**\n   * Helper function to write a tag key, breakscaping appropriately.\n   * Use only to write a tag key.\n   *\n   * @param s\n   */\n  protected writeTagKey<T extends string>(s?: T): void {\n    if (s != null) {\n      this.write(\n        Breakscape.breakscape(`${s}`, {\n          format: TextFormat.plainText,\n          location: TextLocation.tag,\n        }),\n      );\n    }\n  }\n\n  /**\n   * Write text or value, handling:\n   *  - the format and location (i.e. conversion to text and breakscaping).\n   *  - the spaces around values (if tag value).\n   *\n   * @param text\n   * @param format\n   * @param location\n   * @param options\n   */\n  protected writeTextOrValue(\n    text: JsonText,\n    format: TextFormatType,\n    location: TextLocationType,\n    options?: GenerateOptions,\n  ) {\n    const isTagValue = location === TextLocation.tag;\n    const s = typeof text === 'string' ? text : undefined;\n    const ast = Array.isArray(text) ? (text as TextAst) : undefined;\n    const spaces = isTagValue ? this.spacesAroundValuesStr : '';\n\n    // For plain strings use TextFormat.text, otherwise keep the requested format for breakscaping.\n    const breakscapeFormat = format === TextFormat.bitmarkText ? format : TextFormat.plainText;\n\n    /** Wrap a piece of text in the required padding (only for tag values). */\n    const wrap = (content: string) => (isTagValue ? `${spaces}${content}${spaces}` : content);\n\n    /**\n     * Capture everything written by `action` into `partWriter`,\n     * then restore the original writer and return the trimmed text.\n     */\n    const writeToPartWriter = (action: () => void): string => {\n      const originalWriter = this.writer;\n\n      this.writer = this.partWriter;\n      this.partWriter.openSync();\n\n      action();\n\n      this.partWriter.closeSync();\n      const result = this.partWriter.getString().trim();\n\n      this.writer = originalWriter;\n      return result;\n    };\n\n    /* String */\n    if (s != null) {\n      const writeString = () =>\n        this.write(\n          Breakscape.breakscape(s, {\n            format: breakscapeFormat,\n            location,\n          }),\n        );\n\n      if (isTagValue) {\n        const written = writeToPartWriter(writeString);\n        if (written) this.write(wrap(written));\n      } else {\n        writeString(); // already writes directly to main writer\n      }\n      return; // nothing more to do for string input\n    }\n\n    /* AST */\n    if (ast != null) {\n      const generateAst = () => this.textGenerator.generateSync(ast, format, location, options);\n\n      if (isTagValue) {\n        const written = writeToPartWriter(generateAst);\n        if (written) this.write(wrap(written));\n      } else {\n        generateAst();\n      }\n    }\n  }\n\n  protected writeString(s?: string): void {\n    if (s != null) this.write(`${s}`);\n  }\n\n  protected writeOPBUL(): void {\n    this.write('[•');\n  }\n\n  protected writeOPESC(): void {\n    this.write('[^');\n  }\n\n  protected writeOPRANGLE(): void {\n    this.write('[►');\n  }\n\n  protected writeOPDANGLE(): void {\n    this.write('[▼');\n  }\n\n  protected writeOPD(level: number): void {\n    this.write(`[${'.'.repeat(level)}`);\n  }\n\n  protected writeOPU(): void {\n    this.write('[_');\n  }\n\n  protected writeOPE(): void {\n    this.write('[=');\n  }\n\n  protected writeOPB(): void {\n    this.write('[!');\n  }\n\n  protected writeOPQ(): void {\n    this.write('[?');\n  }\n\n  protected writeOPA(): void {\n    this.write('[@');\n  }\n\n  protected writeOPP(): void {\n    this.write('[+');\n  }\n\n  protected writeOPM(): void {\n    this.write('[-');\n  }\n\n  protected writeOPS(): void {\n    this.write('[\\\\');\n  }\n\n  protected writeOPR(): void {\n    this.write('[*');\n  }\n\n  protected writeOPC(): void {\n    this.write('[%');\n  }\n\n  protected writeOPAMP(): void {\n    this.write('[&');\n  }\n\n  protected writeOPDOLLAR(): void {\n    this.write('[$');\n  }\n\n  protected writeOPHASH(): void {\n    this.write('[#');\n  }\n\n  protected writeOPPRE(): void {\n    this.write(\"['\");\n  }\n\n  protected writeOPPOST(): void {\n    this.write('['); // TODO - not sure what symbol is for postfix\n  }\n\n  protected writeOP(): void {\n    this.write('[');\n  }\n\n  protected writeCL(): void {\n    // HACK to fix breakscaping when string ends with a ^ (must add a space) if\n    // options.spacesAroundValues is 0\n    if (this.spacesAroundValues === 0) {\n      if (this.writer.getLastWrite().endsWith('^')) {\n        this.write(' ]');\n      } else {\n        this.write(']');\n      }\n    } else {\n      this.write(']');\n    }\n  }\n\n  protected writeAmpersand(): void {\n    this.write('&');\n  }\n\n  protected writeColon(): void {\n    this.write(':');\n  }\n\n  // protected writeDoubleColon(): void {\n  //   this.write('::');\n  // }\n\n  protected writeHash(): void {\n    this.write('#');\n  }\n\n  protected writeSpacesAroundValues(): void {\n    this.write(this.spacesAroundValuesStr);\n  }\n\n  protected writePlainTextDivider(): void {\n    this.writeNL();\n    this.write('==== text ====');\n  }\n\n  protected writeCardSetStart(): void {\n    this.writeNL();\n    if (this.options.cardSetVersion === CardSetVersion.v1) {\n      this.write('===');\n    } else {\n      this.write('====');\n    }\n  }\n\n  protected writeCardSetEnd(): void {\n    this.writeNL();\n    if (this.options.cardSetVersion === CardSetVersion.v1) {\n      this.write('===');\n    } else {\n      // this.write('==== footer ===='); // Written by the footer\n    }\n  }\n\n  protected writeCardSetCardDivider(qualifier?: string): void {\n    this.writeNL();\n    const divider = this.getCardDividerMarker();\n    this.write(divider);\n    if (qualifier) {\n      this.appendCardDividerQualifier(qualifier);\n    }\n  }\n\n  protected writeCardSetSideDivider(): void {\n    this.writeNL();\n    if (this.options.cardSetVersion === CardSetVersion.v1) {\n      this.write('==');\n    } else {\n      this.write('--');\n    }\n  }\n\n  protected writeCardSetVariantDivider(): void {\n    this.writeNL();\n    if (this.options.cardSetVersion === CardSetVersion.v1) {\n      this.write('--');\n    } else {\n      this.write('++');\n    }\n  }\n\n  private getCardDividerMarker(): string {\n    return this.options.cardSetVersion === CardSetVersion.v1 ? '===' : '====';\n  }\n\n  private appendCardDividerQualifier(qualifier: string): void {\n    const marker = this.getCardDividerMarker();\n    const normalizedQualifier = Breakscape.breakscape(qualifier, {\n      format: TextFormat.plainText,\n      location: TextLocation.tag,\n    });\n    this.write(' ');\n    this.write(normalizedQualifier);\n    this.write(' ');\n    this.write(marker);\n  }\n\n  protected writeNL_IfNotChain(route: NodeInfo[]): void {\n    if (!this.isChain(route)) {\n      this.writeNL();\n    }\n  }\n\n  protected writeNL(): void {\n    if (this.options.debugGenerationInline) {\n      this.write('\\\\n');\n      return;\n    }\n    this.write('\\n');\n  }\n\n  protected writePropertyStyleResource(\n    key: string,\n    resource: ResourceJson,\n    deprecated_writeAsProperty = false,\n  ): boolean | void {\n    if (key && resource) {\n      const resourceTag = Enum(ResourceType).keyFromValue(resource.type) ?? '';\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const resourceData = (resource as any)[resourceTag];\n      const src = resourceData\n        ? resourceData.src || resourceData.url || resourceData.body || ''\n        : '';\n\n      if (deprecated_writeAsProperty) {\n        this.writeOPA();\n      } else {\n        this.writeOPAMP();\n      }\n      this.writeTagKey(key);\n      this.writeColon();\n      this.writeTextOrValue(src, TextFormat.plainText, TextLocation.tag);\n\n      if (resource.type === ResourceType.article) {\n        // this.writeNL();\n      }\n      this.writeCL();\n    }\n  }\n\n  protected writeResource(type: ResourceTypeType, value: string): void {\n    // const resourceAsArticle = resource as ArticleResource;\n\n    if (type) {\n      // Standard case\n      this.writeOPAMP();\n      this.writeTagKey(type);\n      this.writeColon();\n      this.writeTextOrValue(value, TextFormat.plainText, TextLocation.tag);\n\n      if (type === ResourceType.article) {\n        // this.writeNL();\n      }\n      this.writeCL();\n    }\n  }\n\n  protected writeProperty(\n    name: string,\n    values: unknown | unknown[] | undefined,\n    route: NodeInfo[],\n    options: {\n      format: TagFormatType;\n      array?: boolean;\n      ignoreFalse?: boolean;\n      ignoreTrue?: boolean;\n      writeEmpty?: boolean;\n      forceChain?: boolean;\n    },\n  ): void {\n    let valuesArray: unknown[];\n\n    if (values !== undefined) {\n      const isBitmarkText = options.format === TagFormat.bitmarkText;\n\n      if (isBitmarkText) {\n        // Write bitmark text\n        if (!options.writeEmpty && isBitmarkText && this.isEmptyText(values as TextAst)) return;\n        this.writeOPA();\n        this.writeTagKey(name);\n        this.writeColon();\n        this.writeTextOrValue(values as TextAst, TextFormat.bitmarkText, TextLocation.tag);\n        this.writeCL();\n      } else {\n        // Write any other property type\n        if (!Array.isArray(values)) {\n          valuesArray = [values];\n        } else {\n          valuesArray = values;\n        }\n\n        if (valuesArray.length > 0) {\n          if (!options.array) valuesArray = valuesArray.slice(valuesArray.length - 1);\n\n          let propertyIndex = 0;\n          for (const val of valuesArray) {\n            if (val !== undefined) {\n              if (options.ignoreFalse && val === false) continue;\n              if (options.ignoreTrue && val === true) continue;\n              if (!options.writeEmpty && val === '') continue;\n              // if (propertyIndex > 0) this.writeNL_IfNotChain(route);\n              if (!options.forceChain && propertyIndex === 0) this.writeNL_IfNotChain(route);\n              this.writeOPA();\n              this.writeTagKey(name);\n              this.writeColon();\n              this.writeTextOrValue(`${val}`, TextFormat.plainText, TextLocation.tag);\n              this.writeCL();\n              propertyIndex++;\n            }\n          }\n        }\n      } // isBitmarkText\n    }\n  }\n\n  protected writeInlineDebug(\n    key: string,\n    state: { open?: boolean; close?: boolean; single?: boolean },\n  ) {\n    let tag = key;\n    if (state.open) {\n      tag = `<${key}>`;\n    } else if (state.close) {\n      tag = `</${key}>`;\n    } else if (state.single) {\n      tag = `<${key} />`;\n    }\n\n    this.writeString(tag);\n  }\n\n  //\n  // Helper functions\n  //\n\n  protected isEmptyText(text: TextAst | undefined): boolean {\n    if (!text) return true;\n    if (Array.isArray(text)) return text.length === 0;\n    return true; // true as not valid TextAst?\n  }\n\n  protected isWriteTextFormat(bitsValue: string, textFormatDefault: TextFormatType): boolean {\n    const isDefault = Enum(TextFormat).fromValue(bitsValue) === textFormatDefault;\n    const writeFormat = !isDefault || this.options.explicitTextFormat;\n    return !!writeFormat;\n  }\n\n  protected calculateIsCardAllowed(): boolean {\n    return this.isBodyBitmarkText && !this.isOfBitType1() && !this.isTableBitType();\n  }\n\n  protected isTableBitType(): boolean {\n    return this.isOfBitType([BitType.table]);\n  }\n\n  protected isOfBitType1(): boolean {\n    return this.isOfBitType([\n      BitType.trueFalse1,\n      BitType.multipleChoice1,\n      BitType.multipleResponse1,\n    ]);\n  }\n\n  protected isOfBitType(baseBitType: BitTypeType | BitTypeType[]): boolean {\n    return Config.isOfBitType(this.bitType, baseBitType);\n  }\n\n  //\n  // Writer interface\n  //\n\n  /**\n   * Writes a string value to the output.\n   * @param value - The string value to be written.\n   */\n  write(value: string): this {\n    this.writer.write(value);\n    return this;\n  }\n\n  /**\n   * Writes a new line to the output. The line is indented automatically. The line is ended with the endOfLineString.\n   * @param value - The line to write. When omitted, only the endOfLineString is written.\n   */\n  writeLine(value?: string): this {\n    this.writer.writeLine(value);\n    return this;\n  }\n\n  /**\n   * Writes a collection of lines to the output. Each line is indented automatically and ended with the endOfLineString.\n   * @param values - The lines to write.\n   * @param delimiter - An optional delimiter to be written at the end of each line, except for the last one.\n   */\n  writeLines(values: string[], delimiter?: string): this {\n    this.writer.writeLines(values, delimiter);\n    return this;\n  }\n\n  /**\n   * Writes a single whitespace character to the output.\n   */\n  writeWhiteSpace(): this {\n    this.writer.writeWhiteSpace();\n    return this;\n  }\n}\n\nexport { BitmarkGenerator };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst CardSetVersion = {\n  v1: 1,\n  v2: 2,\n} as const;\n\nexport type CardSetVersionType = EnumType<typeof CardSetVersion>;\n\nexport { CardSetVersion };\n","import { StringWriter } from '../../ast/writer/StringWriter.ts';\nimport { type BitmarkAst } from '../../model/ast/Nodes.ts';\nimport { type Generator } from '../Generator.ts';\nimport { BitmarkGenerator, type BitmarkGeneratorOptions } from './BitmarkGenerator.ts';\n\n/**\n * Generate bitmark markup from a bitmark AST as a string\n */\nclass BitmarkStringGenerator implements Generator<BitmarkAst, string> {\n  private generator: BitmarkGenerator;\n  private writer: StringWriter;\n\n  /**\n   * Generate bitmark markup from a bitmark AST as a string\n   *\n   * @param bitmarkVersion - bitmark version, use null to use latest version\n   * @param options - bitmark generation options\n   */\n  constructor(options?: BitmarkGeneratorOptions) {\n    this.writer = new StringWriter();\n    this.generator = new BitmarkGenerator(this.writer, options);\n  }\n\n  /**\n   * Generate bitmark markup from bitmark AST as a string\n   *\n   * @param ast bitmark AST\n   */\n  public async generate(ast: BitmarkAst): Promise<string> {\n    await this.generator.generate(ast);\n    return this.writer.getString();\n  }\n\n  /**\n   * Generate bitmark markup from bitmark AST as a string synchronously\n   *\n   * @param ast bitmark AST\n   */\n  public generateSync(ast: BitmarkAst): string {\n    this.generator.generateSync(ast);\n    return this.writer.getString();\n  }\n}\n\nexport { BitmarkStringGenerator };\n","/**\n * Generate HTML `<table>` fragments from bitmark table bit-JSON.\n *\n * Consumes the JSON bit array (a string or parsed value), like {@link PlainTextGenerator}, and\n * renders each `table` / `table-extended` bit as a pretty-printed HTML `<table>` fragment. Cell\n * content (TextAst) is rendered back to inline/block HTML, mapping bitmark marks to inline tags.\n *\n * See PLAN-013 for the full specification.\n */\n\nimport type { TextAst, TextMark, TextNode } from '../../model/ast/TextNodes.ts';\nimport type {\n  TableCellJson,\n  TableExtendedJson,\n  TableJson,\n  TableSectionJson,\n} from '../../model/json/BitJson.ts';\nimport { convertBasicToExtendedTableFormat } from '../../parser/json/TableUtils.ts';\n\ntype Section = 'header' | 'body' | 'footer';\n\n// bitmark TextMarkType value -> HTML inline tag\nconst MARK_TO_TAG: Record<string, string> = {\n  bold: 'b',\n  italic: 'i',\n  superscript: 'sup',\n  subscript: 'sub',\n  strike: 's',\n  del: 'del',\n  ins: 'ins',\n  underline: 'u',\n  highlight: 'mark',\n  code: 'code',\n};\n\n// Existing bitmark text parsing can leave inline images as text tokens in table cells.\n// Match the bitmark inline image shape `==alt==|imageInline:src|width:40|`:\n// - group 1 captures simple alt text between `==` delimiters.\n// - group 2 captures a src with no whitespace or `|` characters.\n// - group 3 captures simple pipe-delimited key/value attributes and comments.\n// This intentionally handles generated/simple image tokens, not every possible bitmark image form.\nconst INLINE_IMAGE_RE =\n  /==([^=]*(?:=(?!=)[^=]*)*)==\\|imageInline:([^|\\s]+)((?:\\|(?:@?[A-Za-z][A-Za-z0-9_-]*:[^|\\s]+|#[^|\\s]*))*)\\|?/g;\nconst MAX_IMAGE_DIMENSION = 9999;\n\ninterface BitLike {\n  type?: string;\n  caption?: TextAst | string;\n  table?: TableJson | TableExtendedJson;\n}\n\nclass HtmlTableGenerator {\n  private readonly indentUnit = '  ';\n\n  /**\n   * Generate HTML table fragments from a string or JSON value.\n   * @returns the concatenated `<table>` fragments, blank-line separated (empty string if none).\n   */\n  generate(input: string | unknown): string {\n    let data: unknown = input;\n    if (typeof data === 'string') {\n      try {\n        data = JSON.parse(data);\n      } catch {\n        return '';\n      }\n    }\n\n    const bits = this.collectBits(data);\n    const fragments: string[] = [];\n    for (const bit of bits) {\n      const html = this.renderTableBit(bit);\n      if (html) fragments.push(html);\n    }\n    return fragments.join('\\n\\n');\n  }\n\n  // --- bit collection -------------------------------------------------------\n\n  private collectBits(data: unknown): BitLike[] {\n    const out: BitLike[] = [];\n    const visit = (value: unknown): void => {\n      if (value == null || typeof value !== 'object') return;\n      if (Array.isArray(value)) {\n        value.forEach(visit);\n        return;\n      }\n      const obj = value as Record<string, unknown>;\n      if ('bit' in obj && obj.bit && typeof obj.bit === 'object') {\n        out.push(obj.bit as BitLike);\n      } else if ('type' in obj) {\n        out.push(obj as BitLike);\n      }\n    };\n    visit(data);\n    return out;\n  }\n\n  // --- table rendering ------------------------------------------------------\n\n  private renderTableBit(bit: BitLike): string {\n    const table = bit.table;\n    if (!table) return '';\n    if (bit.type !== 'table' && bit.type !== 'table-extended') return '';\n\n    const extended = this.toExtended(table);\n\n    const lines: string[] = [];\n    lines.push('<table>');\n\n    if (bit.caption != null) {\n      const caption = this.cellContentToHtml(this.asTextAst(bit.caption));\n      if (caption) lines.push(`${this.indentUnit}<caption>${caption}</caption>`);\n    }\n\n    this.renderSection(lines, 'thead', extended.header, 'header');\n    this.renderSection(lines, 'tbody', extended.body, 'body');\n    this.renderSection(lines, 'tfoot', extended.footer, 'footer');\n\n    lines.push('</table>');\n    return lines.join('\\n');\n  }\n\n  private toExtended(table: TableJson | TableExtendedJson): TableExtendedJson {\n    const t = table as TableJson & TableExtendedJson;\n    if (t.header || t.body || t.footer) return table as TableExtendedJson;\n    return convertBasicToExtendedTableFormat(table as TableJson);\n  }\n\n  private renderSection(\n    lines: string[],\n    tag: string,\n    section: TableSectionJson | undefined,\n    key: Section,\n  ): void {\n    if (!section || !section.rows || section.rows.length === 0) return;\n\n    lines.push(`${this.indentUnit}<${tag}>`);\n    for (const row of section.rows) {\n      lines.push(`${this.indentUnit.repeat(2)}<tr>`);\n      for (const cell of row.cells ?? []) {\n        lines.push(`${this.indentUnit.repeat(3)}${this.renderCell(cell, key)}`);\n      }\n      lines.push(`${this.indentUnit.repeat(2)}</tr>`);\n    }\n    lines.push(`${this.indentUnit}</${tag}>`);\n  }\n\n  private renderCell(cell: TableCellJson, _key: Section): string {\n    // Title-driven, matching the bitmark generator (section defaults are applied at parse time\n    // when setting `title`, not at render time).\n    const tag = cell.title === true ? 'th' : 'td';\n\n    const attrs: string[] = [];\n    if (cell.rowspan && cell.rowspan > 1) attrs.push(`rowspan=\"${cell.rowspan}\"`);\n    if (cell.colspan && cell.colspan > 1) attrs.push(`colspan=\"${cell.colspan}\"`);\n    if (cell.scope) attrs.push(`scope=\"${cell.scope}\"`);\n    if (cell.colwidth && cell.colwidth > 0) attrs.push(`width=\"${cell.colwidth}\"`);\n\n    const open = attrs.length > 0 ? `<${tag} ${attrs.join(' ')}>` : `<${tag}>`;\n    return `${open}${this.cellContentToHtml(this.asTextAst(cell.content))}</${tag}>`;\n  }\n\n  // --- cell content (TextAst -> HTML) ---------------------------------------\n\n  private asTextAst(content: TextAst | string | undefined): TextAst {\n    if (content == null) return [];\n    if (typeof content === 'string') return [{ type: 'text', text: content } as TextNode];\n    return content;\n  }\n\n  private cellContentToHtml(blocks: TextAst): string {\n    if (blocks.length === 0) return '';\n    // Single bare paragraph: omit the <p> wrapper.\n    if (blocks.length === 1 && blocks[0].type === 'paragraph') {\n      return this.inlineToHtml(blocks[0].content ?? []);\n    }\n    return blocks.map((b) => this.blockToHtml(b)).join('');\n  }\n\n  private blockToHtml(node: TextNode): string {\n    switch (node.type) {\n      case 'paragraph':\n        return `<p>${this.inlineToHtml(node.content ?? [])}</p>`;\n      case 'bulletList':\n      case 'noBulletList':\n      case 'orderedList':\n      case 'orderedListRoman':\n      case 'orderedListRomanLower':\n      case 'letteredList':\n      case 'letteredListLower':\n      case 'taskList':\n        return this.listToHtml(node);\n      case 'image':\n      case 'imageInline':\n        return this.imageToHtml(node);\n      case 'latex':\n        return this.latexToHtml(node);\n      default:\n        return this.inlineToHtml([node]);\n    }\n  }\n\n  private inlineToHtml(nodes: TextNode[]): string {\n    return nodes.map((n) => this.inlineNodeToHtml(n)).join('');\n  }\n\n  private inlineNodeToHtml(node: TextNode): string {\n    if (node.type === 'hardBreak') return '<br>';\n    if (node.type === 'image' || node.type === 'imageInline') return this.imageToHtml(node);\n    if (node.type === 'latex') return this.latexToHtml(node);\n\n    if (node.type === 'text') {\n      return this.wrapMarks(this.textToHtml(node.text ?? ''), node.marks);\n    }\n\n    // Any other node: render its children inline.\n    if (node.content) return this.inlineToHtml(node.content);\n    return this.escapeText(node.text ?? '');\n  }\n\n  private wrapMarks(text: string, marks: TextMark[] | undefined): string {\n    if (!marks || marks.length === 0) return text;\n\n    let open = '';\n    let close = '';\n    for (const mark of marks) {\n      if (mark.type === 'link') {\n        const href = (mark as { attrs?: { href?: string } }).attrs?.href ?? '';\n        open += `<a href=\"${this.escapeAttr(href)}\">`;\n        close = `</a>${close}`;\n      } else {\n        const tag = MARK_TO_TAG[mark.type];\n        if (tag) {\n          open += `<${tag}>`;\n          close = `</${tag}>${close}`;\n        }\n        // Marks with no HTML mapping (light, highlight colours, etc.) -> inner text only.\n      }\n    }\n    return `${open}${text}${close}`;\n  }\n\n  // --- lists ----------------------------------------------------------------\n\n  private listToHtml(node: TextNode): string {\n    const { tag, attrs } = this.listTag(node);\n    const items = (node.content ?? [])\n      .map((item) => this.listItemToHtml(item, node.type === 'taskList'))\n      .join('');\n    return `<${tag}${attrs}>${items}</${tag}>`;\n  }\n\n  private listTag(node: TextNode): { tag: string; attrs: string } {\n    const start = (node as { attrs?: { start?: number } }).attrs?.start;\n    const startAttr = typeof start === 'number' && start !== 1 ? ` start=\"${start}\"` : '';\n    switch (node.type) {\n      case 'orderedList':\n        return { tag: 'ol', attrs: startAttr };\n      case 'orderedListRoman':\n        return { tag: 'ol', attrs: ` type=\"I\"${startAttr}` };\n      case 'orderedListRomanLower':\n        return { tag: 'ol', attrs: ` type=\"i\"${startAttr}` };\n      case 'letteredList':\n        return { tag: 'ol', attrs: ` type=\"A\"${startAttr}` };\n      case 'letteredListLower':\n        return { tag: 'ol', attrs: ` type=\"a\"${startAttr}` };\n      case 'noBulletList':\n        return { tag: 'ul', attrs: ' style=\"list-style:none\"' };\n      case 'taskList':\n      case 'bulletList':\n      default:\n        return { tag: 'ul', attrs: '' };\n    }\n  }\n\n  private listItemToHtml(item: TextNode, task: boolean): string {\n    const inner = (item.content ?? [])\n      .map((b) => {\n        // List-item paragraphs render inline (no <p> wrapper); nested lists render as lists.\n        if (b.type === 'paragraph') return this.inlineToHtml(b.content ?? []);\n        return this.blockToHtml(b);\n      })\n      .join('');\n\n    if (task) {\n      const checked = (item as { attrs?: { checked?: boolean } }).attrs?.checked ? ' checked' : '';\n      return `<li><input type=\"checkbox\"${checked}>${inner}</li>`;\n    }\n    return `<li>${inner}</li>`;\n  }\n\n  // --- images ---------------------------------------------------------------\n\n  private imageToHtml(node: TextNode): string {\n    const attrs = (node as { attrs?: Record<string, unknown> }).attrs ?? {};\n    const parts: string[] = [];\n    const src = attrs.src;\n    parts.push(`src=\"${this.escapeAttr(typeof src === 'string' ? src : '')}\"`);\n    if (typeof attrs.alt === 'string') parts.push(`alt=\"${this.escapeAttr(attrs.alt)}\"`);\n    if (typeof attrs.title === 'string') parts.push(`title=\"${this.escapeAttr(attrs.title)}\"`);\n    if (attrs.width != null) parts.push(`width=\"${attrs.width}\"`);\n    if (attrs.height != null) parts.push(`height=\"${attrs.height}\"`);\n    if (typeof attrs.class === 'string' && attrs.class) {\n      parts.push(`class=\"${this.escapeAttr(attrs.class)}\"`);\n    }\n    return `<img ${parts.join(' ')}>`;\n  }\n\n  private textToHtml(text: string): string {\n    let html = '';\n    let lastIndex = 0;\n\n    for (const match of text.matchAll(INLINE_IMAGE_RE)) {\n      const index = match.index ?? 0;\n      html += this.escapeText(text.slice(lastIndex, index));\n      html += this.inlineImageTokenToHtml(match);\n      lastIndex = index + match[0].length;\n    }\n\n    html += this.escapeText(text.slice(lastIndex));\n    return html;\n  }\n\n  private inlineImageTokenToHtml(match: RegExpMatchArray): string {\n    const attrs: Record<string, unknown> = {\n      alt: match[1],\n      src: match[2],\n    };\n\n    const rawAttrs = match[3] ?? '';\n    for (const attr of rawAttrs.split('|')) {\n      if (!attr || attr.startsWith('#')) continue;\n      const colon = attr.indexOf(':');\n      if (colon < 1) continue;\n\n      const key = attr.slice(0, colon).replace(/^@/, '');\n      const value = attr.slice(colon + 1);\n      if (key === 'width' || key === 'height') {\n        const n = Number.parseInt(value, 10);\n        if (!Number.isNaN(n) && n > 0 && n <= MAX_IMAGE_DIMENSION) attrs[key] = n;\n      } else if (key === 'class' || key === 'title') {\n        attrs[key] = value;\n      }\n    }\n\n    return this.imageToHtml({ type: 'imageInline', attrs } as unknown as TextNode);\n  }\n\n  // --- formulas -------------------------------------------------------------\n\n  private latexToHtml(node: TextNode): string {\n    const formula = (node as { attrs?: { formula?: string } }).attrs?.formula ?? '';\n    return `<math alttext=\"${this.escapeAttr(formula)}\"></math>`;\n  }\n\n  // --- escaping -------------------------------------------------------------\n\n  private escapeText(text: string): string {\n    return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n  }\n\n  private escapeAttr(text: string): string {\n    return this.escapeText(text).replace(/\"/g, '&quot;');\n  }\n}\n\nexport { HtmlTableGenerator };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { Ast, type NodeInfo } from '../../ast/Ast.ts';\nimport { type Writer } from '../../ast/writer/Writer.ts';\nimport { Breakscape } from '../../breakscaping/Breakscape.ts';\nimport { Config } from '../../config/Config.ts';\nimport { type BreakscapedString } from '../../model/ast/BreakscapedString.ts';\nimport { type Bit, type BitmarkAst } from '../../model/ast/Nodes.ts';\nimport { type Example, type ExtraProperties } from '../../model/ast/Nodes.ts';\nimport { type Body, type CardBit } from '../../model/ast/Nodes.ts';\nimport { NodeType, type NodeTypeType } from '../../model/ast/NodeType.ts';\nimport {\n  type JsonText,\n  type TextAst,\n  type TextNode,\n  type TextNodeAttibutes,\n} from '../../model/ast/TextNodes.ts';\nimport {\n  configKeyToPropertyType,\n  configKeyToResourceType,\n} from '../../model/config/enum/ConfigKey.ts';\nimport {\n  BitmarkVersion,\n  type BitmarkVersionType,\n  DEFAULT_BITMARK_VERSION,\n} from '../../model/enum/BitmarkVersion.ts';\nimport { BitType, type BitTypeType } from '../../model/enum/BitType.ts';\nimport { BodyBitType, type BodyBitTypeType } from '../../model/enum/BodyBitType.ts';\nimport { ExampleType } from '../../model/enum/ExampleType.ts';\nimport { PropertyKey } from '../../model/enum/PropertyKey.ts';\nimport { ResourceType, type ResourceTypeType } from '../../model/enum/ResourceType.ts';\nimport { TextFormat, type TextFormatType } from '../../model/enum/TextFormat.ts';\nimport { TextLocation, type TextLocationType } from '../../model/enum/TextLocation.ts';\nimport { TextNodeType } from '../../model/enum/TextNodeType.ts';\nimport {\n  type BitJson,\n  type BookReferenceJson,\n  type ExampleJson,\n  type HeadingJson,\n  type ListItemJson,\n  type MarkConfigJson,\n  type StatementJson,\n  type TableExtendedJson,\n  type TableJson,\n} from '../../model/json/BitJson.ts';\nimport { type BitWrapperJson } from '../../model/json/BitWrapperJson.ts';\nimport { type BodyBitJson } from '../../model/json/BodyBitJson.ts';\nimport {\n  type ImageResourceWrapperJson,\n  type ResourceJson,\n  type ResourceWrapperJson,\n} from '../../model/json/ResourceJson.ts';\nimport { type ParserInfo } from '../../model/parser/ParserInfo.ts';\nimport { TextParser } from '../../parser/text/TextParser.ts';\nimport { BooleanUtils } from '../../utils/BooleanUtils.ts';\nimport { NumberUtils } from '../../utils/NumberUtils.ts';\nimport { AstWalkerGenerator } from '../AstWalkerGenerator.ts';\nimport { TextGenerator } from '../text/TextGenerator.ts';\n\nconst MOVE_BODY_RECURSION_LIMIT = 5000;\n\nconst DEFAULT_OPTIONS: JsonOptions = {\n  // debugGenerationInline: true,\n};\n\n/**\n * JSON output options\n */\nexport interface JsonOptions {\n  /**\n   * Enable parser warnings.\n   *\n   * If not set or false, parser warnings will not be included in the output.\n   * If true, any parser warnings will be included in the output.\n   */\n  enableWarnings?: boolean | number;\n\n  /**\n   * Prettify the JSON.\n   *\n   * If not set or false, JSON will not be prettified.\n   * If true, JSON will be prettified with an indent of 2.\n   * If a positive integer, JSON will be prettified with an indent of this number.\n   *\n   * If prettify is set, a string will be returned if possible.\n   */\n  prettify?: boolean | number;\n\n  /**\n   * Stringify the JSON.\n   *\n   * If not set or false, JSON will be returned as a plain JS object.\n   * It true, JSON will be stringified.\n   *\n   * If prettify is set, it will override this setting.\n   */\n  stringify?: boolean;\n\n  /**\n   * Output text as plain text rather than parsed bitmark text\n   *\n   * If not set, the default for the bitmark version will be used.\n   * If false, text will be output as parsed bitmark text.\n   * It true, text will be output as plain text strings.\n   */\n  textAsPlainText?: boolean;\n\n  /**\n   * Exclude unknown properties in the output.\n   *\n   * If not set or false, unknown properties will be included in the JSON output.\n   * It true, unknown properties will NOT be included in the JSON output.\n   *\n   */\n  excludeUnknownProperties?: boolean;\n\n  /**\n   * [development only]\n   * Generate debug information in the output.\n   */\n  debugGenerationInline?: boolean;\n}\n\n/**\n * JSON generator options\n */\nexport interface JsonGeneratorOptions {\n  /**\n   * bitmarkVersion - The version of bitmark to output.\n   * If not specified, the version will default to 3.\n   *\n   * Specifying the version will set defaults for other options.\n   * - Bitmark v2:\n   *   - textAsPlainText: true\n   * - Bitmark v3:\n   *   - textAsPlainText: false\n   */\n  bitmarkVersion?: BitmarkVersionType;\n\n  /**\n   * The options for JSON generation.\n   */\n  jsonOptions?: JsonOptions;\n}\n\ninterface ExampleNode {\n  isExample: boolean;\n  example?: Example | undefined;\n  __isDefaultExample: boolean;\n}\n\ninterface ExampleJsonWrapper {\n  isExample: boolean;\n  example: ExampleJson;\n}\n\n/**\n * Generate bitmark JSON from a bitmark AST\n *\n *\n */\nclass JsonGenerator extends AstWalkerGenerator<BitmarkAst, void> {\n  protected ast = new Ast();\n  protected textGenerator: TextGenerator;\n  private bitmarkVersion: BitmarkVersionType;\n  private textParserVersion: string;\n  private textParser = new TextParser();\n\n  // TODO - move to context\n  private options: JsonOptions;\n  private jsonPrettifySpace: number | undefined;\n  private writer: Writer;\n\n  // State\n  private json: Partial<BitWrapperJson>[] = [];\n  private bitWrapperJson: Partial<BitWrapperJson> = {};\n  private bitJson: Partial<BitJson> = {};\n  private textDefault: JsonText = Breakscape.EMPTY_STRING;\n  private bodyDefault: JsonText = Breakscape.EMPTY_STRING;\n  private bodyJson: JsonText = this.bodyDefault;\n  private listItem: ListItemJson | undefined;\n  private placeholderIndex = 0;\n\n  /**\n   * Generate bitmark JSON from a bitmark AST\n   *\n   * @param writer - destination for the output\n   * @param options - JSON generation options\n   */\n  constructor(writer: Writer, options?: JsonGeneratorOptions) {\n    super();\n\n    // Bind callbacks\n    this.enter = this.enter.bind(this);\n    this.between = this.between.bind(this);\n    this.exit = this.exit.bind(this);\n    this.leaf = this.leaf.bind(this);\n    this.bodyBitCallback = this.bodyBitCallback.bind(this);\n\n    this.bitmarkVersion =\n      Enum(BitmarkVersion).fromValue(options?.bitmarkVersion) ?? DEFAULT_BITMARK_VERSION;\n    this.textParserVersion = this.textParser.version();\n    this.options = {\n      ...DEFAULT_OPTIONS,\n      ...options?.jsonOptions,\n    };\n\n    this.debugGenerationInline = this.options.debugGenerationInline ?? false;\n    this.jsonPrettifySpace =\n      this.options.prettify === true ? 2 : this.options.prettify || undefined;\n\n    // Set defaults according to bitmark version\n    if (this.bitmarkVersion === BitmarkVersion.v2) {\n      if (this.options.textAsPlainText === undefined) {\n        this.options.textAsPlainText = true;\n      }\n    } else {\n      if (this.options.textAsPlainText === undefined) {\n        this.options.textAsPlainText = false;\n      }\n    }\n\n    // Create the text generator for generating v2 texts\n    this.textGenerator = new TextGenerator(BitmarkVersion.v2, {\n      // writeCallback: this.write,\n      bodyBitCallback: this.bodyBitCallback,\n      debugGenerationInline: this.debugGenerationInline,\n    });\n\n    this.writer = writer;\n\n    this.generatePropertyHandlers();\n  }\n\n  /**\n   * Generate bitmark markup from bitmark AST\n   *\n   * @param ast bitmark AST\n   */\n  public async generate(ast: BitmarkAst): Promise<void> {\n    // Reset the state\n    this.resetState();\n\n    // Open the writer\n    await this.writer.open();\n\n    // Walk the bitmark AST\n    this.walkAndWrite(ast);\n\n    // Write the JSON object to file\n    this.write(JSON.stringify(this.json, null, this.jsonPrettifySpace));\n\n    // Close the writer\n    await this.writer.close();\n  }\n\n  /**\n   * Generate text from a bitmark text AST synchronously\n   *\n   * @param ast bitmark text AST\n   */\n  public generateSync(ast: BitmarkAst): void {\n    // Reset the state\n    this.resetState();\n\n    // Open the writer\n    this.writer.openSync();\n\n    // Walk the bitmark AST\n    this.walkAndWrite(ast);\n\n    // Write the JSON object to file\n    this.write(JSON.stringify(this.json, null, this.jsonPrettifySpace));\n\n    // Close the writer\n    this.writer.closeSync();\n  }\n\n  private resetState(): void {\n    this.json = [];\n    this.bitWrapperJson = {};\n    this.bitJson = {};\n    this.textDefault = this.options.textAsPlainText ? Breakscape.EMPTY_STRING : [];\n    this.bodyDefault = this.options.textAsPlainText ? Breakscape.EMPTY_STRING : [];\n    this.bodyJson = this.bodyDefault;\n    this.listItem = undefined;\n    this.placeholderIndex = 0;\n\n    this.printed = false;\n  }\n\n  private walkAndWrite(ast: BitmarkAst): void {\n    // Walk the bitmark AST\n    this.ast.walk(ast, NodeType.bitmarkAst, this, undefined);\n  }\n\n  //\n  // NODE HANDLERS\n  //\n\n  //\n  // Non-Terminal nodes (branches)\n  //\n\n  // bitmark\n\n  protected enter_bitmarkAst(_node: NodeInfo, _route: NodeInfo[]): void {\n    // Reset the JSON\n    this.json = [];\n  }\n\n  protected exit_bitmarkAst(_node: NodeInfo, _route: NodeInfo[]): void {\n    // Convert all bitmark text to plain text if required\n    if (this.options.textAsPlainText) {\n      // Convert all bitmark text to plain text\n      this.convertAllBitmarkTextsToStringsForPlainText(this.json);\n    }\n\n    // Walk the entire json object and remove all' '_xxx' properties\n    // (which are used to store temporary data during the generation process)\n    this.removeTemporaryProperties(this.json);\n  }\n\n  // bitmarkAst -> bits\n\n  // bitmarkAst -> bits -> bitsValue\n\n  protected enter_bitsValue(node: NodeInfo, _route: NodeInfo[]): void {\n    const bit = node.value as Bit;\n\n    // Reset\n    this.bitWrapperJson = {\n      //\n    };\n    this.json.push(this.bitWrapperJson);\n\n    this.bitJson = this.createBitJson(bit);\n    this.bitWrapperJson.bit = this.bitJson as BitJson;\n\n    // Handle example at the root level - this is bit dependent; configuration is in the bit metadata\n    // There is same logic here to select the correct default value of the example is the default is\n    // required, and this is bit depenedent.\n    // This is ugly, but it is even uglier if the defaults at set in the AST.\n\n    const bitConfig = Config.getBitConfig(bit.bitType);\n    const textFormat = this.getTextFormat(_route);\n    const hasRootExample = !!bitConfig.rootExampleType;\n    const isBoolean = bitConfig.rootExampleType === ExampleType.boolean;\n\n    if (hasRootExample) {\n      // Calculate the value of the default example\n      let defaultExample: string | boolean;\n      if (isBoolean) {\n        // Boolean example\n        defaultExample = true;\n        if (Config.isOfBitType(bit.bitType, BitType.trueFalse1)) {\n          if (bit.cardNode?.statement?.isCorrect !== undefined) {\n            defaultExample = bit.cardNode.statement.isCorrect;\n          }\n        }\n      } else {\n        // String example\n        // Don't use sampleSolution as the default example for conversation bits\n        // See: https://github.com/getMoreBrain/cosmic/issues/7293\n        // defaultExample = (ArrayUtils.asSingle(bit.sampleSolution) as string) ?? '';\n        defaultExample = 'true';\n      }\n\n      const exampleRes = this.toExample(bit as ExampleNode, {\n        defaultExample,\n        isBoolean,\n        textFormat,\n      });\n      this.bitJson.isExample = exampleRes.isExample;\n      this.bitJson.example = exampleRes.example;\n    } else if (bit.isExample) {\n      this.bitJson.isExample = true;\n    }\n\n    // Reset the placeholder index\n    this.placeholderIndex = 0;\n  }\n\n  protected exit_bitsValue(_node: NodeInfo, _route: NodeInfo[]): void {\n    // Move isExample / example to end of bit JSON from beginning\n    const isExample = this.bitJson.isExample;\n    const example = this.bitJson.example;\n    delete this.bitJson.isExample;\n    delete this.bitJson.example;\n    this.bitJson.isExample = isExample;\n    this.bitJson.example = example;\n\n    // Clean up the bit JSON, removing any unwanted values\n    this.cleanBitJson(this.bitJson);\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> imageSource\n\n  protected enter_imageSource(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> person\n\n  protected enter_person(node: NodeInfo, route: NodeInfo[]): boolean {\n    const bitType = this.getBitType(route);\n\n    let keyOverride = 'person';\n    if (Config.isOfBitType(bitType, BitType.conversationLeft1)) {\n      // Use the legacy partner property in the JSON for conversation bits, so change to person is backwards compatible\n      keyOverride = 'partner';\n    }\n\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false, keyOverride });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> ratingLevelStart\n\n  protected enter_ratingLevelStart(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> ratingLevelEnd\n\n  protected enter_ratingLevelEnd(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> sourceBB\n\n  protected enter_sourceBB(node: NodeInfo, route: NodeInfo[]): boolean {\n    const tuples = node.value as number[][] | undefined;\n\n    // Ignore item that is not at the correct level\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return false;\n\n    if (tuples && tuples.length > 0) {\n      this.bitJson.sourceBB = tuples.length === 1 ? tuples[0] : tuples;\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> productId\n\n  protected enter_productId(node: NodeInfo, route: NodeInfo[]): boolean {\n    const productIds = node.value as string[];\n\n    // Ignore item that is not at the correct level\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    const bitType = this.getBitType(route);\n\n    if (bitType === BitType.module) {\n      this.addProperty(this.bitJson, 'productId', productIds, { array: true });\n    } else if (productIds.length > 0) {\n      this.addProperty(this.bitJson, 'productId', productIds[productIds.length - 1], {\n        array: false,\n      });\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> isCollapsible\n\n  /**\n   * PLAN-016: `isCollapsible` is emitted only when true. `false` is the implied\n   * default for every bit, so it is never written to the JSON — an absent key\n   * means the bit's configured default (`true` for the deprecated\n   * `*-collapsible` bit types, `false` everywhere else).\n   *\n   * Defining these handlers suppresses the generic property handlers that\n   * `generatePropertyHandlers()` would otherwise install for this tag.\n   */\n  protected leaf_isCollapsible(node: NodeInfo, route: NodeInfo[]): boolean {\n    // Ignore any property that is not at the bit level\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return false;\n\n    if (node.value === true) this.bitJson.isCollapsible = true;\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  protected enter_isCollapsible(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.leaf_isCollapsible(node, route);\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> markConfig\n\n  protected enter_markConfig(_node: NodeInfo, _route: NodeInfo[]): boolean {\n    // Handler so markConfig is not processed by the default property handler\n    // Continue traversal\n    return true;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> markConfig -> markConfigValue\n\n  protected enter_markConfigValue(node: NodeInfo, route: NodeInfo[]): boolean {\n    const markJson = node.value as MarkConfigJson;\n\n    // Ignore item that is not at the correct level\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.markConfig) return true;\n\n    if (!this.bitJson.marks) this.bitJson.marks = [];\n    this.bitJson.marks.push(markJson);\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> item\n\n  protected enter_item(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> lead\n\n  protected enter_lead(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> pageNumber\n\n  protected enter_pageNumber(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> marginNumber\n\n  protected enter_marginNumber(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> hint\n\n  protected enter_hint(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> instruction\n\n  protected enter_instruction(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> titleString\n\n  protected leaf_titleString(node: NodeInfo, route: NodeInfo[]): boolean {\n    // Ignore title that are not at the bit level as they are handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.bitsValue) return true;\n\n    // this.bitJson.title = node.value;\n    return this.standardHandler(node, route, [NodeType.bitsValue], {\n      array: false,\n      keyOverride: 'title',\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> title\n\n  protected enter_title(node: NodeInfo, route: NodeInfo[]): boolean {\n    // // Ignore title that are not at the bit or card node level as they are handled elsewhere\n    // const parent = this.getParentNode(route);\n    // if (parent?.key !== NodeType.bitsValue && parent?.key !== NodeType.cardNode) return;\n\n    // this.bitJson.title = node.value;\n    return this.standardHandler(node, route, [NodeType.bitsValue, NodeType.cardNode], {\n      array: true,\n    });\n  }\n\n  //  bitmarkAst -> bits -> bitsValue -> subtitle\n\n  protected enter_subtitle(node: NodeInfo, route: NodeInfo[]): boolean {\n    // this.bitJson.subtitle = node.value;\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: true });\n  }\n\n  //  bitmarkAst -> bits -> bitsValue -> caption\n\n  protected enter_caption(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> width\n\n  protected enter_width(node: NodeInfo, route: NodeInfo[]): boolean {\n    let value = node.value as string | number;\n    const bitType = this.getBitType(route);\n\n    const parent = this.getParentNode(route);\n    if (parent?.key === NodeType.bitsValue && Config.isOfBitType(bitType, BitType.extractorBlock)) {\n      value = NumberUtils.asNumber(value, 0) ?? 0;\n    }\n\n    // Add the property\n    return this.standardHandler(node, route, undefined, { array: false, valueOverride: value });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> height\n\n  protected enter_height(node: NodeInfo, route: NodeInfo[]): boolean {\n    let value = node.value as string | number;\n    const bitType = this.getBitType(route);\n\n    const parent = this.getParentNode(route);\n    if (parent?.key === NodeType.bitsValue && Config.isOfBitType(bitType, BitType.extractorBlock)) {\n      value = NumberUtils.asNumber(value, 0) ?? 0;\n    }\n\n    // Add the property\n    return this.standardHandler(node, route, undefined, { array: false, valueOverride: value });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> extraProperties\n\n  protected enter_extraProperties(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const extraProperties = node.value as ExtraProperties | undefined;\n\n    if (!this.options.excludeUnknownProperties && extraProperties) {\n      for (const [key, values] of Object.entries(extraProperties)) {\n        let k = key;\n        if (Object.prototype.hasOwnProperty.call(this.bitJson, key)) {\n          k = `_${key}`;\n        }\n        this.addProperty(this.bitJson, k, values, { array: true });\n      }\n    }\n\n    // Return false to stop the AST walker descending into the extraProperties children.\n    // Otherwise per-key handlers (e.g. enter_width) would fire for any extra-property key\n    // that matches a known property name, emitting it as a first-class field and bypassing\n    // the excludeUnknownProperties guard. See PLAN-014.\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> cardBits -> cardBitsValue\n\n  protected enter_cardBitsValue(node: NodeInfo, route: NodeInfo[]): void {\n    const cardBit = node.value as CardBit;\n\n    // How cardBits are handled depends on the bit type\n    const bitType = this.getBitType(route);\n    if (!bitType) return;\n\n    let listItems: ListItemJson[] | undefined;\n\n    if (bitType === BitType.bookReferenceList) {\n      if (!this.bitJson.bookReferences) this.bitJson.bookReferences = [];\n      const bookReference: Partial<BookReferenceJson> = {};\n\n      this.addProperty(bookReference, 'lang', cardBit.lang, { array: false });\n      this.addProperty(bookReference, 'refAuthor', cardBit.refAuthor ?? [], { array: true });\n      this.addProperty(bookReference, 'refBookTitle', cardBit.refBookTitle ?? [], { array: false });\n      this.addProperty(bookReference, 'refPublisher', cardBit.refPublisher ?? [], { array: true });\n      this.addProperty(bookReference, 'refPublicationYear', cardBit.refPublicationYear ?? [], {\n        array: false,\n      });\n      this.addProperty(bookReference, 'citationStyle', cardBit.citationStyle ?? [], {\n        array: false,\n      });\n\n      this.bitJson.bookReferences.push(bookReference as BookReferenceJson);\n    } else {\n      // Create the listItems / sections if not already created\n      if (bitType === BitType.pageFooter) {\n        if (!this.bitJson.sections) this.bitJson.sections = [];\n        listItems = this.bitJson.sections;\n      } else {\n        if (!this.bitJson.listItems) this.bitJson.listItems = [];\n        listItems = this.bitJson.listItems;\n      }\n\n      // Create this list item\n      this.listItem = {\n        item: (cardBit.item ?? []) as JsonText,\n        lead: (cardBit.lead ?? []) as JsonText,\n        hint: (cardBit.hint ?? []) as JsonText,\n        instruction: (cardBit.instruction ?? []) as JsonText,\n        // ...this.toItemLeadHintInstruction(node.value),\n        body: this.bodyDefault,\n      };\n\n      // Delete unwanted properties\n      // const nv = node.value;\n      // const li: Partial<ListItemJson> = this.listItem;\n\n      listItems.push(this.listItem);\n    }\n  }\n\n  protected exit_cardBitsValue(_node: NodeInfo, _route: NodeInfo[]): void {\n    this.listItem = undefined;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> body\n\n  protected enter_body(node: NodeInfo, route: NodeInfo[]): boolean {\n    const value = node.value as Body;\n\n    const parent = this.getParentNode(route);\n    if (!parent) return false;\n\n    const textFormat = this.getTextFormat(route);\n    const isBitmarkText = textFormat === TextFormat.bitmarkText;\n\n    this.bodyJson = value.body as JsonText;\n\n    // Set the correct body property\n    if (parent.key === NodeType.bitsValue) {\n      // Body is at the bit level\n      this.bitJson.body = this.bodyJson;\n\n      const bodyIsBitmarkText = isBitmarkText && this.isBitmarkText(this.bodyJson);\n\n      // Convert the body to plain text if required\n      if (this.options.textAsPlainText && bodyIsBitmarkText) {\n        const textBody = this.textGenerator.generateSync(\n          this.bodyJson as TextAst,\n          textFormat,\n          TextLocation.body,\n          {\n            noBreakscaping: true,\n          },\n        );\n        this.bitJson.body = (textBody ?? '').trim();\n      } else if (bodyIsBitmarkText) {\n        // If the body is bitmark text, convert the body bits to move their attributes to the attrs property\n        this.bitJson.body = this.moveBodyBitPropertiesToAttrs(this.bodyJson as TextAst);\n      }\n    } else if (parent.key === NodeType.cardBitsValue) {\n      // Body is at the list item (card bit) level\n      if (this.listItem) this.listItem.body = this.bodyJson;\n    }\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  protected bodyBitCallback(bodyBit: BodyBitJson, _index: number, _route: NodeInfo[]): string {\n    // console.log('bodyBitCallback', bodyBit, index, route);\n\n    const placeholder = `{${this.placeholderIndex}}`;\n    this.placeholderIndex++;\n    this.bitJson.placeholders = this.bitJson.placeholders ?? {};\n    this.bitJson.placeholders[placeholder] = bodyBit;\n\n    return placeholder;\n  }\n\n  /**\n   * Move all properties of body bits to the attrs property.\n   * This function is called recursively to process all body bits in the body tree.\n   *\n   * NOTE: Internally, the body bit is stored as it appears in bitmark v2, but in v3 all the properties\n   * should be in the `attrs` property. The properies are only moved to 'attrs' for the JSON output\n   *\n   * The original body bit is not modified.\n   * The function returns a new body bit with the properties moved.\n   *\n   * @param nodes the body to process, or the subtree to process\n   * @param recursion leave as default, used for recursion only\n   * @returns\n   */\n  protected moveBodyBitPropertiesToAttrs(nodes: TextAst, recursion: number = 0): TextAst {\n    if (recursion === 0) {\n      nodes = structuredClone(nodes);\n    } else if (recursion > MOVE_BODY_RECURSION_LIMIT) {\n      throw new Error('Recursion limit exceeded');\n    }\n    for (const node of nodes) {\n      if (\n        node.type !== BodyBitType.text &&\n        Enum(BodyBitType)\n          .values()\n          .includes(node.type as BodyBitTypeType)\n      ) {\n        const bodyBit = node as unknown as BodyBitJson;\n        bodyBit.attrs = {} as Record<string, unknown>;\n\n        // Move all properties except type to the attrs property\n        for (const [key, value] of Object.entries(bodyBit)) {\n          if (key === 'type' || key === 'attrs') continue;\n          bodyBit.attrs[key] = value;\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          delete (bodyBit as any)[key];\n        }\n      } else if (Array.isArray(node.content)) {\n        recursion++;\n        this.moveBodyBitPropertiesToAttrs(node.content as TextAst, recursion);\n      }\n    }\n\n    return nodes;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> footer\n\n  protected enter_footer(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, undefined, {\n      array: true,\n      valueOverride: node.value.footer,\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> elements\n\n  protected enter_elements(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, undefined, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> flashcards\n\n  protected enter_flashcards(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, {\n      array: true,\n      keyOverride: 'cards',\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> definitions\n\n  protected enter_definitions(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> statement\n\n  protected enter_statement(node: NodeInfo, route: NodeInfo[]): void {\n    const statement = node.value as StatementJson;\n\n    // Ignore statement that is not at the cardNode level as it is handled elsewhere\n    const parent = this.getParentNode(route);\n    if (parent?.key !== NodeType.cardNode) return;\n\n    if (statement) {\n      this.bitJson.statement = statement.statement ?? [];\n      this.bitJson.isCorrect = statement.isCorrect ?? false;\n      this.bitJson.example = statement.example;\n      this.bitJson.isExample = statement.isExample;\n    }\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> statements -> statementsValue\n\n  protected enter_statements(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> choices\n  // X bitmarkAst -> bits -> bitsValue -> cardNode -> quizzes -> quizzesValue -> choices\n  // X bitmarkAst -> bits -> bitsValue -> cardNode -> feedbacks -> feedbacksValue -> choices\n\n  protected enter_choices(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> responses\n  // X bitmarkAst -> bits -> bitsValue -> cardNode -> quizzes -> quizzesValue -> responses\n\n  protected enter_responses(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> feedbacks\n\n  protected enter_feedbacks(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> quizzes\n\n  protected enter_quizzes(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> heading\n\n  protected enter_heading(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, undefined, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> pairs\n\n  protected enter_pairs(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> matrix\n\n  protected enter_matrix(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> pronunciationTable\n\n  protected enter_pronunciationTable(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> table\n\n  protected enter_table(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> questions\n\n  protected enter_questions(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> botResponses\n\n  protected enter_botResponses(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, {\n      array: true,\n      keyOverride: 'responses',\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> ingredients -> ingredientsValue\n  protected enter_ingredients(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> cardNode -> captionDefinitionList\n\n  protected enter_captionDefinitionList(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.cardNode, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> backgroundWallpaper\n\n  protected enter_backgroundWallpaper(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> imagePlaceholder\n\n  protected enter_imagePlaceholder(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> previewImage\n\n  protected enter_previewImage(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> previewVideo\n\n  protected enter_previewVideo(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> platformIcon\n\n  protected enter_platformIcon(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> platformLogo\n\n  protected enter_platformLogo(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> platformBackgroundImage\n\n  protected enter_platformBackgroundImage(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> coverImage\n\n  protected enter_coverImage(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, {\n      array: Array.isArray(node.value),\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> backgroundImage\n\n  protected enter_backgroundImage(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, {\n      array: Array.isArray(node.value),\n    });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> resources\n\n  protected enter_resources(node: NodeInfo, route: NodeInfo[]): boolean {\n    const resources = node.value as ResourceJson[];\n    const bitType = this.getBitType(route);\n    const resourceType = this.getResourceType(route);\n\n    if (!resources || !bitType) return true;\n\n    let resourceJson: ResourceJson | undefined;\n\n    const bitConfig = Config.getBitConfig(bitType);\n    const bitResourcesConfig = Config.getBitResourcesConfig(bitType, resourceType);\n    const comboMap = bitResourcesConfig.comboResourceConfigKeysMap;\n\n    if (comboMap.size > 0) {\n      // The resource is a combo resource\n      // Extract the resource types from the combo resource\n      // NOTE: There should only ever be one combo resource per bit, but the code can handle multiple\n      // except for overwriting resourceJson\n      for (const [comboConfigKey, resourceConfigKeys] of comboMap.entries()) {\n        // Convert the config key to a ResourceType\n        const comboTagType = configKeyToResourceType(comboConfigKey);\n\n        // Create the combo resource wrapper\n        const wrapper: ResourceWrapperJson = {\n          type: comboTagType,\n          __typeAlias: comboTagType,\n          __configKey: comboConfigKey,\n        };\n\n        // For each of the resources in this combo resource, find the actual resource and add it to the JSON\n        for (const ck of resourceConfigKeys) {\n          const r = resources.find((r) => r.__configKey === ck);\n          // Extract everything except the type from the resource\n          if (r) {\n            const tagConfig = Config.getTagConfigForTag(bitConfig.tags, r.__configKey);\n            if (tagConfig) {\n              const key = tagConfig.jsonKey ?? tagConfig.tag;\n              const configKey = tagConfig.configKey ?? r.__configKey;\n              const json = r.__configKey === configKey ? r : undefined;\n              if (json) {\n                for (const [k, v] of Object.entries(json)) {\n                  if (k !== 'type') {\n                    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n                    (wrapper as any)[key] = v;\n                  }\n                }\n              }\n            }\n          }\n        }\n        resourceJson = wrapper as ResourceJson;\n      }\n    } else if (\n      Config.isOfBitType(bitType, [\n        BitType.imagesLogoGrave,\n        BitType.prototypeImages,\n        BitType.extractorImage,\n      ])\n    ) {\n      // The resource is a logo-grave  / prototpye-images resource\n      const images: ImageResourceWrapperJson[] = [];\n      for (const r of resources) {\n        if (r.type === ResourceType.image) {\n          images.push(r);\n        }\n      }\n      if (bitType === BitType.imagesLogoGrave) {\n        this.bitJson.logos = images;\n      } else {\n        this.bitJson.images = images;\n      }\n    } else {\n      // This is a standard resource. If there is more than one resource, use the first one.\n      // There should not be more than one because of validation\n      if (resources.length >= 1) {\n        resourceJson = resources[0]; // this.parseResourceToJson(bitType, resources[0]);\n      }\n    }\n\n    this.bitJson.resource = resourceJson;\n\n    return false;\n  }\n\n  //  bitmarkAst -> bits -> bitsValue -> level\n\n  protected leaf_level(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> book (array)\n\n  protected enter_book(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: true });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> book (single)\n\n  protected leaf_book(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  //  bitmarkAst -> bits -> bitsValue -> anchor\n\n  protected leaf_anchor(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  //  bitmarkAst -> bits -> bitsValue -> reference\n\n  protected leaf_reference(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  //  bitmarkAst -> bits -> bitsValue -> referenceEnd\n\n  protected leaf_referenceEnd(node: NodeInfo, route: NodeInfo[]): boolean {\n    return this.standardHandler(node, route, NodeType.bitsValue, { array: false });\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> markup\n\n  protected leaf_markup(node: NodeInfo, _route: NodeInfo[]): boolean {\n    const bitmark = node.value as string | undefined;\n    if (bitmark) this.bitWrapperJson.bitmark = bitmark;\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> * -> internalComment\n\n  protected enter_internalComment(_node: NodeInfo, _route: NodeInfo[]): boolean {\n    // Stop traversal of this branch, handled in enter_parser()\n    return false;\n  }\n\n  // bitmarkAst -> bits -> bitsValue -> parser\n\n  protected enter_parser(node: NodeInfo, route: NodeInfo[]): void {\n    const parser = node.value as ParserInfo | undefined;\n    const bitType = this.getBitType(route);\n    const parent = this.getParentNode(route);\n\n    if (parser && bitType) {\n      const { version, warnings, errors, ...parserRest } = parser;\n      const bitmarkVersion = `${this.bitmarkVersion}`;\n      const textParserVersion = this.textParserVersion;\n\n      // Extract internal comments from the AST and add to the parser\n      const internalComments = this.getInternalComments(route);\n\n      if (parent?.key === NodeType.bitsValue) {\n        // Bit level parser information\n        this.bitWrapperJson.parser = {\n          version,\n          bitmarkVersion,\n          textParserVersion,\n          internalComments,\n          ...parserRest,\n          warnings,\n          errors,\n        };\n\n        if (!this.options.enableWarnings) {\n          // Remove warnings if not enabled\n          delete this.bitWrapperJson.parser.warnings;\n        }\n      } else {\n        // Top level parser information (not specific to a bit)\n        // TODO - not sure where this error can be written\n        // this.bitWrapperJson.parser = {\n        //   errors,\n        // };\n      }\n    }\n  }\n\n  // bitmarkAst -> errors\n\n  // protected enter_errors(node: NodeInfo, _route: NodeInfo[],\n  // context: Context): void {\n  //   const errors = node.value as ParserError[] | undefined;\n  //   if (errors && errors.length > 0) {\n  //     // Complete bit is invalid\n  //     // TODO - not sure where this error can be written\n  //     // this.bitWrapperJson.parser = {\n  //     //   errors,\n  //     // };\n  //   }\n  // }\n\n  //\n  // Generated Node Handlers\n  //\n\n  /**\n   * Generate the handlers for properties, as they are mostly the same, but not quite\n   */\n  protected generatePropertyHandlers() {\n    // TODO\n    // const propertiesConfig = Config.getRawPropertiesConfig();\n    // for (const propertyConfig of Object.values(propertiesConfig)) {\n    //   const astKey = propertyConfig.astKey ?? propertyConfig.tag;\n    //   const funcName = `enter_${astKey}`;\n    //   // Skip if the function already exists, allows for custom handlers\n    //   // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    //   if (typeof (this as any)[funcName] === 'function') {\n    //     continue;\n    //   }\n    //   // Skip 'example' property as it is non-standard and handled elsewhere\n    //   if (astKey === 'example') continue;\n    //   // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    //   (this as any)[funcName] = (node: NodeInfo, route: NodeInfo[]) => {\n    //     const value = node.value as unknown[] | undefined;\n    //     if (value == null) return;\n    //     // if (key === 'progress') debugger;\n    //     // Ignore any property that is not at the bit level as that will be handled by a different handler\n    //     const parent = this.getParentNode(route);\n    //     if (parent?.key !== NodeType.bitsValue) return;\n    //     // Convert key as needed\n    //     const jsonKey = propertyConfig.jsonKey ?? propertyConfig.tag;\n    //     // Add the property\n    //     this.addProperty(this.bitJson, jsonKey, value, { array: !propertyConfig.single });\n    //   };\n    //   // Bind this\n    //   // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    //   (this as any)[funcName] = (this as any)[funcName].bind(this);\n    // }\n\n    for (const propertyConfigKey of Enum(PropertyKey).values()) {\n      const propertyTag = configKeyToPropertyType(propertyConfigKey);\n\n      const funcNames = [`enter_${propertyTag}`, `leaf_${propertyTag}`];\n      for (const funcName of funcNames) {\n        // Skip if the function already exists, allows for custom handlers\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        if (typeof (this as any)[funcName] === 'function') {\n          continue;\n        }\n        // Skip 'example' property as it is non-standard and handled elsewhere\n        if (propertyTag === 'example') continue;\n\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        (this as any)[funcName] = (node: NodeInfo, route: NodeInfo[]) => {\n          const value = node.value as unknown[] | undefined;\n          if (value == null) return;\n          // if (key === 'progress') debugger;\n          // Ignore any property that is not at the bit level as that will be handled by a different handler\n          const parent = this.getParentNode(route);\n          if (parent?.key !== NodeType.bitsValue) return;\n          // // Convert key as needed\n          // const jsonKey = propertyConfig.jsonKey ?? propertyConfig.tag;\n          // // Add the property\n          // this.addProperty(this.bitJson, jsonKey, value, { array: !propertyConfig.single });\n\n          // Add the property\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          (this.bitJson as any)[propertyTag] = value;\n        };\n        // Bind this\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        (this as any)[funcName] = (this as any)[funcName].bind(this);\n      }\n    }\n  }\n\n  // // END NODE HANDLERS\n\n  //\n  // HELPER FUNCTIONS\n  //\n\n  /**\n   * Default handler for properties.\n   *\n   * @param node the node\n   * @param route  the route to the node\n   * @param parentNodeTypes the parent node types for which to handle the node\n   * @returns\n   */\n  protected standardHandler(\n    node: NodeInfo,\n    route: NodeInfo[],\n    parentNodeTypes: NodeTypeType | NodeTypeType[] | undefined,\n    options: {\n      array: boolean;\n      allowNull?: boolean;\n      keyOverride?: string;\n      valueOverride?: unknown;\n    },\n  ): boolean {\n    // Ignore items not at the nodeType level\n    if (parentNodeTypes) {\n      const nodeTypeArray = Array.isArray(parentNodeTypes) ? parentNodeTypes : [parentNodeTypes];\n      const parent = this.getParentNode(route);\n      if (!parent?.key || !nodeTypeArray.includes(parent?.key)) return true;\n    }\n\n    // Add the property\n    this.addProperty(\n      this.bitJson,\n      options.keyOverride ?? node.key,\n      options.valueOverride ?? node.value,\n      options,\n    );\n\n    // Stop traversal of this branch\n    return false;\n  }\n\n  protected addProperty(\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    target: any,\n    name: string,\n    values: unknown | unknown[] | undefined,\n    options: {\n      array: boolean;\n      allowNull?: boolean;\n    },\n  ): void {\n    if (values !== undefined) {\n      let finalValue: unknown | unknown[] | undefined;\n      if (!Array.isArray(values)) values = [values];\n      const valuesArr = values as unknown[];\n\n      // if (valuesArr.length > 0) {\n      if (!options.array && valuesArr.length >= 1) {\n        finalValue = valuesArr[valuesArr.length - 1];\n      } else {\n        finalValue = valuesArr;\n      }\n      // }\n\n      if (options.allowNull || finalValue != null) {\n        target[name] = finalValue;\n      }\n    }\n  }\n\n  protected toExample(\n    node: ExampleNode,\n    options: {\n      defaultExample: string | boolean | null;\n      isBoolean: boolean;\n      textFormat: TextFormatType;\n    },\n  ): ExampleJsonWrapper {\n    const { isExample, example, __isDefaultExample } = node;\n    const { defaultExample, isBoolean } = options;\n\n    if (!isExample) {\n      return {\n        isExample: false,\n        example: null,\n      };\n    }\n\n    let exampleValue;\n    if (__isDefaultExample) {\n      exampleValue = isBoolean\n        ? BooleanUtils.toBoolean(defaultExample)\n        : this.convertBreakscapedStringToJsonText(\n            defaultExample as BreakscapedString,\n            options.textFormat,\n            TextLocation.tag,\n          );\n    } else {\n      exampleValue = isBoolean\n        ? BooleanUtils.toBoolean(example)\n        : this.convertBreakscapedStringToJsonText(\n            example as BreakscapedString,\n            options.textFormat,\n            TextLocation.tag,\n          );\n    }\n\n    return {\n      isExample: true,\n      example: exampleValue,\n    };\n  }\n\n  /**\n   * Get the bit type from any node\n   *\n   * @param route the route to the current node\n   * @returns the bit type\n   */\n  protected getBitType(route: NodeInfo[]): BitTypeType | undefined {\n    for (const node of route) {\n      if (node.key === NodeType.bitsValue) {\n        const n = node.value as Bit;\n        return n?.bitType;\n      }\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Get the text format from any node\n   *\n   * @param route the route to the current node\n   * @returns the text format\n   */\n  protected getTextFormat(route: NodeInfo[]): TextFormatType {\n    const bitType = this.getBitType(route);\n\n    if (bitType) {\n      const bitConfig = Config.getBitConfig(bitType);\n      for (const node of route) {\n        if (node.key === NodeType.bitsValue) {\n          const n = node.value as Bit;\n          return Enum(TextFormat).fromValue(n?.textFormat) ?? bitConfig.textFormatDefault;\n        }\n      }\n    }\n\n    return TextFormat.bitmarkText;\n  }\n\n  /**\n   * Get the bit resourceType atttachment from any node\n   *\n   * @param route the route to the current node\n   * @returns the bit type\n   */\n  protected getResourceType(route: NodeInfo[]): ResourceTypeType | undefined {\n    for (const node of route) {\n      if (node.key === NodeType.bitsValue) {\n        const n = node.value as Bit;\n        return n?.resourceType;\n      }\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Get the internal comments from any node\n   *\n   * @param route the route to the current node\n   * @returns the text format\n   */\n  protected getInternalComments(route: NodeInfo[]): BreakscapedString[] | undefined {\n    const bitType = this.getBitType(route);\n\n    if (bitType) {\n      for (const node of route) {\n        if (node.key === NodeType.bitsValue) {\n          const n = node.value as Bit;\n          return n.internalComment as BreakscapedString[];\n        }\n      }\n    }\n\n    return undefined;\n  }\n\n  /**\n   * Convert the text from the AST to the JSON format:\n   * Input:\n   *  - breakscaped string\n   * Output:\n   *  - text: plain text\n   *  - json: bitmark text JSON\n   *  - Bitmark v2: breakscaped string\n   *  - Bitmark v3: bitmark text JSON (TextAst)\n   *\n   * In the case of Bitmark v2 type texts, there is nothing to do but cast the type.\n   *\n   * @param text\n   * @returns\n   */\n  protected convertBreakscapedStringToJsonText(\n    text: BreakscapedString | undefined,\n    format: TextFormatType,\n    textLocation: TextLocationType,\n  ): JsonText {\n    if (!text) return '';\n\n    const isBitmarkText = format === TextFormat.bitmarkText;\n\n    if (!isBitmarkText) {\n      // Not bitmark text, so plain text, so  unbreakscape only the start of bit tags\n      return text || '';\n    }\n\n    const asPlainText = this.options.textAsPlainText;\n    if (asPlainText) {\n      return text || '';\n    }\n\n    // Use the text parser to parse the text\n    const textAst = this.textParser.toAst(text, {\n      format,\n      location: textLocation,\n    });\n\n    return textAst;\n  }\n\n  /**\n   * Concatenates a plain JSON text with a JsonText that may be plain (v2) or BitmarkText (v3)\n   * Returns the combined text.\n   *\n   * @param text the text to concatenate\n   * @param textPlain the plain text to concatenate\n   */\n  protected concatenatePlainTextWithJsonTexts(\n    text: JsonText,\n    extraBreaks: number,\n    textPlain: string,\n  ): JsonText {\n    if (Array.isArray(text)) {\n      textPlain = textPlain.trim();\n      if (textPlain) {\n        const splitText = textPlain.split('\\n');\n        const content: TextNode[] = [];\n\n        for (let i = 0; i < extraBreaks; i++) {\n          content.push({\n            type: TextNodeType.hardBreak,\n          });\n        }\n\n        for (let i = 0; i < splitText.length; i++) {\n          const t = splitText[i];\n          if (t) {\n            content.push({\n              text: t,\n              type: TextNodeType.text,\n            });\n          }\n          // Add a hard break after each paragraph, except the last one\n          if (i < splitText.length - 1) {\n            content.push({\n              type: TextNodeType.hardBreak,\n            });\n          }\n        }\n\n        // Add the content to the final paragraph, or create a new one if there none\n        const lastNode = text[text.length - 1];\n        if (lastNode && lastNode.type === TextNodeType.paragraph) {\n          lastNode.content = [...(lastNode.content ?? []), ...content];\n        } else {\n          text.push({\n            type: TextNodeType.paragraph,\n            content,\n            attrs: {} as TextNodeAttibutes,\n          });\n        }\n      }\n      return text;\n    }\n\n    return `${text ?? ''}${'\\n'.repeat(extraBreaks)}${textPlain ?? ''}`;\n  }\n\n  /**\n   * Check if an object is bitmark text\n   * The check looks for a special tag on the array (__tag: 'text')\n   *\n   * @param obj object that might be bitmark text\n   * @returns\n   */\n  protected isBitmarkText(obj: unknown): boolean {\n    if (obj == null) return false;\n    if (!Array.isArray(obj)) return false;\n\n    // Check for the hidden text tag\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    if ((obj as any).__tag === 'text') return true;\n\n    return false;\n  }\n\n  //\n  // WRITE FUNCTIONS\n  //\n\n  protected writeInlineDebug(\n    key: string,\n    state: { open?: boolean; close?: boolean; single?: boolean },\n  ) {\n    let tag = key;\n    if (state.open) {\n      tag = `<${key}>`;\n    } else if (state.close) {\n      tag = `</${key}>`;\n    } else if (state.single) {\n      tag = `<${key} />`;\n    }\n\n    this.writeString(tag);\n  }\n\n  protected writeString(s?: string): void {\n    if (s != null) this.write(`${s}`);\n  }\n\n  /**\n   * Create a new bit json object.\n   * - This function defines the order of the properties in the json.\n   *\n   * @param bit\n   * @returns\n   */\n  protected createBitJson(bit: Bit): Partial<BitJson> {\n    const format: string = bit.textFormat as string;\n\n    const bitJson: Partial<BitJson> = {\n      type: bit.isCommented ? BitType._comment : bit.bitType,\n      originalType: bit.isCommented ? bit.bitType : undefined,\n      format,\n      bitLevel: bit.bitLevel,\n    };\n\n    return bitJson;\n  }\n\n  /**\n   * Remove wanted properties from bit json object.\n   * - This function defines the defaults for properties in the json.\n   *\n   * TODO: All these defaults should come from the config and be set in the Builder.\n   *\n   * @param bit\n   * @returns\n   */\n  protected cleanBitJson(bitJson: Partial<BitJson>): Partial<BitJson> {\n    const bitType = Config.getBitType(bitJson.type);\n    // const bitConfig = Config.getBitConfig(bitType);\n    // const textFormat = bitJson.format;\n    // const plainText = this.options.textAsPlainText;\n\n    // Clear 'originalType' if not set\n    if (bitJson.originalType == null) bitJson.originalType = undefined;\n\n    // Clear 'item' which may be an empty string if 'lead' was set but item not\n    // Only necessary because '.article' does not include a default value for 'item'\n    // which is totally inconsistent, but maybe is wanted.\n    if (!bitJson.item) bitJson.item = undefined;\n\n    // Add default properties to the bit.\n    // NOTE: Not all bits have the same default properties.\n    //       The properties used are a bit random sometimes?\n    //       It would be better if this functionality was generated from the bit config\n    if (Config.isOfBitType(bitType, [BitType._error, BitType._comment])) {\n      // Special case for _error and _comment bits\n      delete bitJson.format;\n      delete bitJson.item;\n      delete bitJson.lead;\n      delete bitJson.pageNumber;\n      delete bitJson.marginNumber;\n      delete bitJson.hint;\n      delete bitJson.instruction;\n      //\n    } else {\n      let isTopLevelExample = false;\n      let isTopLevelExampleValue = false;\n\n      // Most bits have these defaults, but there are special cases (not sure if that is by error or design)\n      if (Config.isOfBitType(bitType, [BitType.page])) {\n        // Bits without item, lead, etc\n        if (bitJson.item == null || bitJson.item?.length === 0) delete bitJson.item;\n        if (bitJson.lead == null || bitJson.lead?.length === 0) delete bitJson.lead;\n        if (bitJson.pageNumber == null || bitJson.pageNumber?.length === 0)\n          delete bitJson.pageNumber;\n        if (bitJson.marginNumber == null || bitJson.marginNumber?.length === 0)\n          delete bitJson.marginNumber;\n        if (bitJson.hint == null || bitJson.hint?.length === 0) delete bitJson.hint;\n        if (bitJson.instruction == null || bitJson.instruction?.length === 0)\n          delete bitJson.instruction;\n      } else {\n        // Majority of bits\n        if (bitJson.item == null) bitJson.item = this.textDefault;\n        if (bitJson.lead == null) bitJson.lead = this.textDefault;\n        if (bitJson.hint == null) bitJson.hint = this.textDefault;\n        if (bitJson.instruction == null) bitJson.instruction = this.textDefault;\n        if (bitJson.pageNumber == null) bitJson.pageNumber = this.textDefault;\n        if (bitJson.marginNumber == null) bitJson.marginNumber = this.textDefault;\n      }\n      if (bitJson.body == null) bitJson.body = this.bodyDefault;\n\n      if (Config.isOfBitType(bitType, [BitType.article])) {\n        //\n      }\n\n      if (Config.isOfBitType(bitType, [BitType.example])) {\n        // With 'example' value at the bit level.\n        isTopLevelExample = true;\n        isTopLevelExampleValue = true;\n      }\n\n      if (\n        Config.isOfBitType(bitType, [\n          BitType.multipleChoice1,\n          BitType.multipleResponse1,\n          BitType.multipleChoiceText,\n          BitType.highlightText,\n          BitType.gapText,\n          BitType.gapTextInstructionGrouped,\n          BitType.clozeAndMultipleChoiceText,\n          BitType.sequence,\n          BitType.mark,\n          BitType.flashcard,\n          BitType.definitionList,\n        ])\n      ) {\n        // With no 'example' value at the bit level.\n        isTopLevelExample = true;\n        if (bitJson.body == null) bitJson.body = this.bodyDefault;\n      }\n\n      if (Config.isOfBitType(bitType, [BitType.sequence])) {\n        // With 'example' value at the bit level.\n        isTopLevelExample = true;\n        isTopLevelExampleValue = true;\n        if (bitJson.body == null) bitJson.body = this.bodyDefault;\n      }\n\n      if (Config.isOfBitType(bitType, BitType.cloze)) {\n        // With no 'example' value at the bit level.\n        isTopLevelExample = true;\n\n        if (Config.isOfBitType(bitType, BitType.clozeSolutionGrouped)) {\n          // Solution grouped\n          if (bitJson.quizCountItems == null) bitJson.quizCountItems = true;\n          if (bitJson.quizStrikethroughSolutions == null) bitJson.quizStrikethroughSolutions = true;\n        } else if (Config.isOfBitType(bitType, BitType.clozeInstructionGrouped)) {\n          // Instruction grouped\n          if (bitJson.quizCountItems == null) bitJson.quizCountItems = true;\n          if (bitJson.quizStrikethroughSolutions == null)\n            bitJson.quizStrikethroughSolutions = false;\n        }\n      }\n\n      if (Config.isOfBitType(bitType, [BitType.multipleChoice, BitType.multipleResponse])) {\n        // Default with a card (and hence a footer possibility)\n        isTopLevelExample = true;\n        if (bitJson.body == null) bitJson.body = this.bodyDefault;\n        if (bitJson.footer == null) bitJson.footer = this.textDefault;\n      }\n\n      if (Config.isOfBitType(bitType, BitType.essay)) {\n        // With 'example' value at the bit level.\n        isTopLevelExample = true;\n        isTopLevelExampleValue = true;\n        if (bitJson.body == null) bitJson.body = this.bodyDefault;\n        if (bitJson.partialAnswer == null) bitJson.partialAnswer = '';\n        // if (bitJson.sampleSolution == null) bitJson.sampleSolution = '';\n      }\n\n      if (Config.isOfBitType(bitType, BitType.trueFalse1)) {\n        // With 'example' value at the bit level.\n        isTopLevelExample = true;\n        isTopLevelExampleValue = true;\n        if (bitJson.isCorrect == null) bitJson.isCorrect = false;\n        if (bitJson.body == null) bitJson.body = this.bodyDefault;\n      }\n\n      if (Config.isOfBitType(bitType, BitType.trueFalse)) {\n        // With no 'example' value at the bit level.\n        isTopLevelExample = true;\n        if (bitJson.labelFalse == null) bitJson.labelFalse = '';\n        if (bitJson.labelTrue == null) bitJson.labelTrue = '';\n        if (bitJson.body == null) bitJson.body = this.bodyDefault;\n      }\n\n      if (Config.isOfBitType(bitType, BitType.chapter)) {\n        //\n        if (bitJson.toc == null) bitJson.toc = true; // Always set on chapter bits?\n        if (bitJson.progress == null) bitJson.progress = true; // Always set on chapter bits\n        if (bitJson.level == null) bitJson.level = 1; // Set level 1 if none set (makes no sense, but in ANTLR parser)\n        if (bitJson.body == null) bitJson.body = this.bodyDefault;\n        //\n      }\n\n      if (Config.isOfBitType(bitType, BitType.interview)) {\n        // With no 'example' value at the bit level.\n        isTopLevelExample = true;\n        if (bitJson.body == null) bitJson.body = this.bodyDefault;\n        if (bitJson.footer == null) bitJson.footer = this.textDefault;\n        if (bitJson.questions == null) bitJson.questions = [];\n      }\n\n      if (Config.isOfBitType(bitType, BitType.sequence)) {\n        if (bitJson.elements == null) bitJson.elements = [];\n      }\n\n      if (bitType === BitType.matchMatrix) {\n        // With no 'example' value at the bit level.\n        isTopLevelExample = true;\n      }\n\n      if (Config.isOfBitType(bitType, BitType.match)) {\n        // With no 'example' value at the bit level.\n        isTopLevelExample = true;\n        if (bitJson.heading == null) bitJson.heading = {} as HeadingJson;\n      }\n\n      if (Config.isOfBitType(bitType, BitType.learningPathBook)) {\n        //\n        if (bitJson.isTracked == null) bitJson.isTracked = true;\n        if (bitJson.isInfoOnly == null) bitJson.isInfoOnly = false;\n        //\n      }\n\n      const tableImageHasTable =\n        Config.isOfBitType(bitType, BitType.tableImage) && !this.tableIsEmpty(bitJson.table);\n      if (\n        (Config.isOfBitType(bitType, BitType.table) &&\n          !Config.isOfBitType(bitType, BitType.tableImage)) ||\n        tableImageHasTable\n      ) {\n        //\n        // if (bitJson.content2Buy == null) bitJson.content2Buy = '';\n        if (bitJson.tableFixedHeader == null) bitJson.tableFixedHeader = false;\n        if (bitJson.tableHeaderWhitespaceNoWrap == null) {\n          bitJson.tableHeaderWhitespaceNoWrap = false;\n        }\n        if (bitJson.tableSearch == null) bitJson.tableSearch = false;\n        if (bitJson.tableSort == null) bitJson.tableSort = false;\n        if (bitJson.tablePagination == null) bitJson.tablePagination = false;\n        if (bitJson.tablePaginationLimit == null) bitJson.tablePaginationLimit = 0;\n        if (bitJson.tableHeight == null) bitJson.tableHeight = 0;\n        if (bitJson.tableWhitespaceNoWrap == null) bitJson.tableWhitespaceNoWrap = false;\n        if (bitJson.tableAutoWidth == null) bitJson.tableAutoWidth = true;\n        if (bitJson.tableResizableColumns == null) bitJson.tableResizableColumns = false;\n        if (bitJson.tableColumnMinWidth == null) bitJson.tableColumnMinWidth = 0;\n        //\n      }\n      if (Config.isOfBitType(bitType, BitType.tableImage) && !tableImageHasTable) {\n        delete bitJson.table;\n      }\n\n      if (Config.isOfBitType(bitType, BitType.bookReference)) {\n        //\n        if (bitJson.refAuthor == null) bitJson.refAuthor = [];\n        if (bitJson.refBookTitle == null) bitJson.refBookTitle = '';\n        if (bitJson.refPublisher == null) bitJson.refPublisher = [];\n        if (bitJson.refPublicationYear == null) bitJson.refPublicationYear = '';\n        //\n      }\n\n      // Page bits\n      if (\n        Config.isOfBitType(bitType, [\n          BitType.pageBanner,\n          BitType.pageBuyButton,\n          BitType.pageBuyButtonAlt,\n          BitType.pageBuyButtonPromotion,\n          BitType.pageFooter,\n          BitType.pageOpenBook,\n          BitType.pagePerson,\n          BitType.printBook,\n          BitType.pageProduct,\n          BitType.pageProductList,\n          BitType.pageProductVideo,\n          BitType.pageProductVideoList,\n          BitType.pageSectionFolder,\n          BitType.pageSubscribe,\n          BitType.pageSubpage,\n        ])\n      ) {\n        //\n        if (bitJson.slug == null) bitJson.slug = '';\n        if (bitJson.body == null) bitJson.body = this.bodyDefault;\n\n        if (Config.isOfBitType(bitType, BitType.pageBuyButton)) {\n          if (bitJson.content2Buy == null) bitJson.content2Buy = '';\n        }\n      }\n\n      // Special case for 'toc-resource' bits\n      if (Config.isOfBitType(bitType, BitType.tocResource)) {\n        if (bitJson.tocResource == null) bitJson.tocResource = [];\n      }\n\n      // Special case for 'toc-content' bits\n      if (Config.isOfBitType(bitType, BitType.tocContent)) {\n        if (bitJson.tocContent == null) bitJson.tocContent = [];\n      }\n\n      // Special case for 'print-this-chapter' bits\n      if (Config.isOfBitType(bitType, BitType.printThisChapter)) {\n        if (bitJson.printParentChapterLevel == null) bitJson.printParentChapterLevel = -1;\n      }\n\n      // Special case for 'book' bits\n      if (Config.isOfBitType(bitType, BitType.book)) {\n        if (bitJson.maxTocChapterLevel == null) bitJson.maxTocChapterLevel = -1;\n        if (bitJson.allowPrint == null) bitJson.allowPrint = 'useSpaceConfiguration';\n        if (bitJson.hasPrintRestriction == null) bitJson.hasPrintRestriction = true;\n        if (bitJson.enforceUpdateOverUserInput == null) bitJson.enforceUpdateOverUserInput = false;\n        if (bitJson.hasMarkAsDone == null) bitJson.hasMarkAsDone = false;\n        if (bitJson.processHandIn == null) bitJson.processHandIn = false;\n        if (bitJson.isPublic == null) bitJson.isPublic = false;\n        if (bitJson.chatWithBook == null) bitJson.chatWithBook = false;\n        if (bitJson.chatWithBookBrainKey == null) bitJson.chatWithBookBrainKey = '';\n      }\n\n      // Special case for 'ai' bits\n      if (\n        bitType === BitType.articleAi ||\n        bitType === BitType.noteAi ||\n        bitType === BitType.summaryAi\n      ) {\n        if (bitJson.aiGenerated == null) bitJson.aiGenerated = true;\n      }\n\n      // Special case for '-responsive...' bits\n      if (Config.isOfBitType(bitType, [BitType.articleResponsive, BitType.pageArticleResponsive])) {\n        if (bitJson.imageFirst == null) bitJson.imageFirst = true;\n      }\n\n      // Special case for 'review-...' bits\n      if (Config.isOfBitType(bitType, BitType.reviewNote)) {\n        if (bitJson.resolved == null) bitJson.resolved = false;\n        if (bitJson.resolvedDate == null) bitJson.resolvedDate = '';\n        if (bitJson.resolvedBy == null) bitJson.resolvedBy = '';\n      }\n\n      // Special case for 'images-logos-grave' / 'prototype-images' / etc bits\n      if (\n        Config.isOfBitType(bitType, [\n          BitType.imagesLogoGrave,\n          BitType.prototypeImages,\n          BitType.extractorImage,\n        ])\n      ) {\n        if (bitType === BitType.imagesLogoGrave) {\n          if (bitJson.logos == null) {\n            bitJson.logos = [];\n          }\n        } else {\n          if (bitJson.images == null) bitJson.images = [];\n        }\n      }\n\n      // Special case for 'stepImageScreenshotWithPointer' / surveyMatrix / etc bits\n      if (\n        Config.isOfBitType(bitType, [BitType.stepImageScreenshotWithPointer, BitType.surveyMatrix])\n      ) {\n        if (bitJson.pointerTop == null) bitJson.pointerTop = '';\n        if (bitJson.pointerLeft == null) bitJson.pointerLeft = '';\n        if (Config.isOfBitType(bitType, [BitType.surveyMatrix])) {\n          if (bitJson.buttonCaption == null) bitJson.buttonCaption = '';\n        }\n      }\n\n      if (Config.isOfBitType(bitType, [BitType.listItem])) {\n        if (bitJson.listItemIndent == null) bitJson.listItemIndent = 0;\n      }\n\n      // Special case for 'survey-rating-*' bits\n      if (Config.isOfBitType(bitType, BitType.surveyRating)) {\n        //\n        if (bitJson.ratingLevelStart == null) {\n          bitJson.ratingLevelStart = {\n            level: 0,\n          };\n        }\n        if (bitJson.ratingLevelEnd == null) {\n          bitJson.ratingLevelEnd = {\n            level: 0,\n          };\n        }\n      }\n\n      // Special case for 'vendor-stripe-pricing-table' bits\n      if (Config.isOfBitType(bitType, BitType.vendorStripePricingTable)) {\n        if (bitJson.stripePricingTableId == null) bitJson.stripePricingTableId = '';\n        if (bitJson.stripePublishableKey == null) bitJson.stripePublishableKey = '';\n\n        if (Config.isOfBitType(bitType, BitType.vendorStripePricingTablePrintOnRequest)) {\n          if (bitJson.printOnRequestCustomerId == null) bitJson.printOnRequestCustomerId = '';\n          if (bitJson.printOnRequestProductId == null) bitJson.printOnRequestProductId = '';\n        }\n      }\n\n      // Special case for 'call-to-action' bits\n      if (Config.isOfBitType(bitType, BitType.callToAction)) {\n        if (bitJson.buttonCaption == null) bitJson.buttonCaption = '';\n        if (bitJson.callToActionUrl == null) bitJson.callToActionUrl = '';\n      }\n\n      // Special case for 'hand-in-file' / 'hand-in-system-media' bits\n      if (Config.isOfBitType(bitType, [BitType.handInFile, BitType.handInSystemMedia])) {\n        if (bitJson.handInAcceptFileType == null) bitJson.handInAcceptFileType = [];\n      }\n\n      // Special case for 'hand-in-submit' bits\n      if (Config.isOfBitType(bitType, BitType.handInSubmit)) {\n        if (bitJson.handInRequirement == null) bitJson.handInRequirement = [];\n        if (bitJson.handInInstruction == null) bitJson.handInInstruction = '';\n        if (bitJson.buttonCaption == null) bitJson.buttonCaption = '';\n      }\n\n      // Special case for 'module' bits\n      if (Config.isOfBitType(bitType, BitType.module)) {\n        if (bitJson.hasBookNavigation == null) bitJson.hasBookNavigation = true;\n      }\n\n      // Special case for 'container' bits\n      if (Config.isOfBitType(bitType, BitType.container)) {\n        if (bitJson.allowedBit == null) bitJson.allowedBit = [];\n      }\n\n      // Special case for 'platform-path' bits\n      if (Config.isOfBitType(bitType, BitType.platformPath)) {\n        if (bitJson.path == null) bitJson.path = '';\n      }\n\n      // Special case for 'platform-brand-target' bits\n      if (Config.isOfBitType(bitType, BitType.platformBrandTarget)) {\n        if (bitJson.platformBrandTarget == null) bitJson.platformBrandTarget = 'none';\n      }\n\n      // Special case for 'platform-header' bits\n      if (Config.isOfBitType(bitType, BitType.platformHeader)) {\n        if (bitJson.platformLogoMaxHeight == null) bitJson.platformLogoMaxHeight = 40;\n      }\n\n      // Remove top level example if it is not required\n      if (isTopLevelExample) {\n        if (bitJson.isExample == null) bitJson.isExample = false;\n      } else {\n        // Remove example\n        delete bitJson.isExample;\n        delete bitJson.example;\n      }\n      if (isTopLevelExampleValue) {\n        if (bitJson.example == null) bitJson.example = null;\n      } else {\n        // Remove example value\n        delete bitJson.example;\n      }\n    }\n\n    return bitJson;\n  }\n\n  protected tableIsEmpty(table: TableJson | TableExtendedJson | undefined): boolean {\n    if (!table) return true;\n    if (Object.keys(table).length === 0) return true;\n    const tableStandard = table as TableJson;\n    if (tableStandard.columns?.length === 0 && tableStandard.data?.length) {\n      return true;\n    }\n\n    const tableExtended = table as TableExtendedJson;\n    if (\n      tableExtended.header?.rows.length === 0 &&\n      tableExtended.body?.rows.length === 0 &&\n      tableExtended.footer?.rows.length === 0\n    ) {\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Convert any bitmark texts to strings.\n   */\n  protected convertAllBitmarkTextsToStringsForPlainText(\n    json: Record<string, unknown> | unknown[],\n  ): void {\n    if (!this.options.textAsPlainText) return;\n\n    const obj = json as Record<string, unknown>;\n    for (const key in obj) {\n      const val = obj[key];\n      if (this.isBitmarkText(val)) {\n        const s = this.textGenerator.generateSync(\n          val as TextAst,\n          TextFormat.bitmarkText,\n          TextLocation.tag,\n          {\n            noBreakscaping: true,\n          },\n        );\n        obj[key] = (s ?? '').trim();\n      } else if (typeof obj[key] === 'object') {\n        this.convertAllBitmarkTextsToStringsForPlainText(obj[key] as Record<string, unknown>);\n      }\n    }\n  }\n\n  /**\n   * Remove any property with a key starting with an double underscore.\n   *\n   * @param json\n   */\n  protected removeTemporaryProperties(json: Record<string, unknown> | unknown[]): void {\n    const obj = json as Record<string, unknown>;\n    for (const key in obj) {\n      if (key.startsWith('__')) {\n        delete obj[key];\n      } else if (typeof obj[key] === 'object') {\n        this.removeTemporaryProperties(obj[key] as Record<string, unknown>);\n      }\n    }\n  }\n\n  //\n  // Writer interface\n  //\n\n  /**\n   * Writes a string value to the output.\n   * @param value - The string value to be written.\n   */\n  write(value: string): this {\n    this.writer.write(value);\n    return this;\n  }\n\n  /**\n   * Writes a new line to the output. The line is indented automatically. The line is ended with the endOfLineString.\n   * @param value - The line to write. When omitted, only the endOfLineString is written.\n   */\n  writeLine(value?: string): this {\n    this.writer.writeLine(value);\n    return this;\n  }\n\n  /**\n   * Writes a collection of lines to the output. Each line is indented automatically and ended with the endOfLineString.\n   * @param values - The lines to write.\n   * @param delimiter - An optional delimiter to be written at the end of each line, except for the last one.\n   */\n  writeLines(values: string[], delimiter?: string): this {\n    this.writer.writeLines(values, delimiter);\n    return this;\n  }\n\n  /**\n   * Writes a single whitespace character to the output.\n   */\n  writeWhiteSpace(): this {\n    this.writer.writeWhiteSpace();\n    return this;\n  }\n}\n\nexport { JsonGenerator };\n","import { StringWriter } from '../../ast/writer/StringWriter.ts';\nimport { type BitmarkAst } from '../../model/ast/Nodes.ts';\nimport { type BitWrapperJson } from '../../model/json/BitWrapperJson.ts';\nimport { type Generator } from '../Generator.ts';\nimport { JsonGenerator, type JsonGeneratorOptions } from './JsonGenerator.ts';\n\n/**\n * Generate bitmark JSON from a bitmark AST as a plain JS object\n *\n */\nclass JsonObjectGenerator implements Generator<BitmarkAst, BitWrapperJson[]> {\n  private generator: JsonGenerator;\n  private writer: StringWriter;\n\n  /**\n   * Generate bitmark JSON from a bitmark AST as a string\n   *\n   * @param options - JSON generation options\n   */\n  constructor(options?: JsonGeneratorOptions) {\n    this.writer = new StringWriter();\n    this.generator = new JsonGenerator(this.writer, options);\n  }\n\n  /**\n   * Generate bitmark JSON from bitmark AST as a plain JS object\n   *\n   * @param ast bitmark AST\n   */\n  public async generate(ast: BitmarkAst): Promise<BitWrapperJson[]> {\n    await this.generator.generate(ast);\n    return JSON.parse(this.writer.getString());\n  }\n\n  /**\n   * Generate bitmark JSON from bitmark AST as a plain JS object synchronously\n   *\n   * @param ast bitmark AST\n   */\n  public generateSync(ast: BitmarkAst): BitWrapperJson[] {\n    this.generator.generateSync(ast);\n    return JSON.parse(this.writer.getString());\n  }\n}\n\nexport { JsonObjectGenerator };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { Config } from '../config/Config.ts';\nimport { BitConfig } from '../model/config/BitConfig.ts';\nimport { BitType, type BitTypeType } from '../model/enum/BitType.ts';\n\nexport interface SupportedBitsOptions {\n  includeNonDeprecated?: boolean; // Default: true\n  includeDeprecated?: boolean; // Default: false\n}\n\nexport interface SupportedBit {\n  name: BitTypeType;\n  since: string;\n  deprecated?: string;\n  inheritedBitTypes?: BitTypeType[];\n}\n\nclass InfoBuilder {\n  public getSupportedBits(options?: SupportedBitsOptions): SupportedBit[] {\n    const includeNonDeprecated = options?.includeNonDeprecated ?? true;\n    const includeDeprecated = options?.includeDeprecated ?? false;\n    const supportedBits: SupportedBit[] = [];\n\n    for (const bt of Enum(BitType).values()) {\n      if (bt === BitType._error || bt === BitType._comment) continue;\n\n      const bitType = Config.getBitType(bt);\n      const bitConfig = Config.getBitConfig(bitType);\n\n      const inheritedBitTypes =\n        bitConfig.inheritedBitTypes.length > 0 ? bitConfig.inheritedBitTypes : undefined;\n\n      const include =\n        (includeNonDeprecated && !bitConfig.deprecated) ||\n        (includeDeprecated && bitConfig.deprecated);\n      if (include) {\n        supportedBits.push({\n          name: bt,\n          since: bitConfig.since,\n          deprecated: bitConfig.deprecated,\n          inheritedBitTypes,\n        });\n      }\n    }\n\n    return supportedBits;\n  }\n\n  public getSupportedBitConfigs(): BitConfig[] {\n    const res: BitConfig[] = [];\n\n    for (const bt of Enum(BitType).values()) {\n      if (bt === BitType._error || bt === BitType._comment) continue;\n\n      const bitType = Config.getBitType(bt);\n      const config: BitConfig = Config.getBitConfig(bitType);\n      res.push(config);\n    }\n\n    return res;\n  }\n}\n\nexport { InfoBuilder };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst BitmarkParserType = {\n  peggy: 'peggy',\n} as const;\n\nexport type BitmarkParserTypeType = EnumType<typeof BitmarkParserType>;\n\nexport { BitmarkParserType };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst InfoFormat = {\n  text: 'text',\n  json: 'json',\n  pojo: 'pojo',\n} as const;\n\nexport type InfoFormatType = EnumType<typeof InfoFormat>;\n\nexport { InfoFormat };\n","import { type EnumType } from '@ncoderz/superenum';\n\nconst InfoType = {\n  list: 'list', // List non-deprecated bits\n  deprecated: 'deprecated', // List deprecated bits\n  all: 'all', // List all bits\n  bit: 'bit', // Get information for a bit\n} as const;\n\nexport type InfoTypeType = EnumType<typeof InfoType>;\n\nexport { InfoType };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { Builder } from '../../ast/Builder.ts';\nimport { Config } from '../../config/Config.ts';\nimport {\n  type Bit,\n  type BitmarkAst,\n  type Body,\n  type CardBit,\n  type Footer,\n} from '../../model/ast/Nodes.ts';\nimport { type JsonText } from '../../model/ast/TextNodes.ts';\nimport { BitType, type BitTypeType } from '../../model/enum/BitType.ts';\nimport { DeprecatedTextFormat } from '../../model/enum/DeprecatedTextFormat.ts';\nimport { ResourceType, type ResourceTypeType } from '../../model/enum/ResourceType.ts';\nimport { TextFormat, type TextFormatType } from '../../model/enum/TextFormat.ts';\nimport {\n  type BitJson,\n  type BotResponseJson,\n  type ExampleJson,\n  type ListItemJson,\n  type ResponseJson,\n  type StatementJson,\n} from '../../model/json/BitJson.ts';\nimport { type BitWrapperJson } from '../../model/json/BitWrapperJson.ts';\nimport { type BodyBitsJson } from '../../model/json/BodyBitJson.ts';\nimport { type ImageResourceWrapperJson, type ResourceJson } from '../../model/json/ResourceJson.ts';\nimport { StringUtils } from '../../utils/StringUtils.ts';\n\ninterface TitleAndTitleString {\n  titleString?: string;\n  title?: JsonText;\n}\n\ninterface ReferenceAndReferenceProperty {\n  reference?: string;\n  referenceProperty?: string | string[];\n}\n\ninterface Example {\n  example: ExampleJson;\n}\n\nconst builder = new Builder();\n\n/**\n * A parser for parsing bitmark JSON to bitmark AST\n */\nclass JsonParser {\n  /**\n   * Convert JSON to AST.\n   *\n   * The JSON can be a bit or a bitwrapper and can be a string or a plain JS object\n   *\n   * @param json - bitmark JSON as a string or a plain JS object\n   * @returns bitmark AST\n   */\n  toAst(json: unknown): BitmarkAst {\n    const bitWrappers = this.preprocessJson(json);\n    const bitsNodes: Bit[] | undefined = [];\n\n    for (const bitWrapper of bitWrappers) {\n      const { bit, parser } = bitWrapper;\n\n      // Transform to AST\n      const bitsNode = this.bitToAst(bit, parser?.internalComments);\n      if (bitsNode) {\n        bitsNodes.push(bitsNode);\n      }\n    }\n\n    const bits = bitsNodes.length > 0 ? { bits: bitsNodes } : {};\n\n    const ast = builder.buildBitmark(bits);\n\n    return ast;\n  }\n\n  /**\n   * Preprocess bitmark JSON into a standard format (BitWrapperJson[] object) from either a bit or a bitwrapper\n   * as a string or a plain JS object\n   *\n   * @param json - bitmark JSON as a string or a plain JS object\n   * @returns bitmark JSON in a standard format (BitWrapperJson[] object)\n   */\n  preprocessJson(json: string | unknown): BitWrapperJson[] {\n    const bitWrappers: BitWrapperJson[] = [];\n\n    if (StringUtils.isString(json)) {\n      const str = json as string;\n      try {\n        json = JSON.parse(str);\n      } catch (_e) {\n        // Failed to parse JSON, return empty array\n        return [];\n      }\n    }\n\n    // Helper function to push an item that is either a BitWrapper or a Bit to the BitWrapper array as a BitWrapper\n    const pushItemAsBitWrapper = (item: unknown): void => {\n      if (this.isBitWrapper(item)) {\n        const w = item as BitWrapperJson;\n        bitWrappers.push(w);\n      } else if (this.isBit(item)) {\n        const b = item as BitJson;\n        bitWrappers.push(this.bitToBitWrapper(b));\n      }\n    };\n\n    // See if we have an array of bits, or a single bit, or any other known format, and convert that into\n    // an array of bits\n    if (Array.isArray(json)) {\n      for (const item of json) {\n        pushItemAsBitWrapper(item);\n      }\n    } else {\n      pushItemAsBitWrapper(json);\n    }\n\n    return bitWrappers;\n  }\n\n  /**\n   * Check if a plain JS object is valid BitWrapper JSON\n   *\n   * @param bitWrapper - a plain JS object that might be BitWrapper JSON\n   * @returns true if BitWrapper JSON, otherwise false\n   */\n  isBitWrapper(bitWrapper: unknown): boolean {\n    if (Object.prototype.hasOwnProperty.call(bitWrapper, 'bit')) {\n      const w = bitWrapper as BitWrapperJson;\n      return this.isBit(w.bit);\n    }\n    return false;\n  }\n\n  /**\n   * Check if a plain JS object is valid Bit JSON\n   *\n   * @param bitWrapper - a plain JS object that might be Bit JSON\n   * @returns true if Bit JSON, otherwise false\n   */\n  isBit(bit: unknown): boolean {\n    if (Object.prototype.hasOwnProperty.call(bit, 'type')) {\n      const b = bit as BitJson;\n      return Config.getBitType(b.type) !== BitType._error;\n    }\n    return false;\n  }\n\n  /**\n   * Convert a Bit to BitWrapper\n   *\n   * @param bit a valid Bit\n   * @returns the Bit wrapper in a BitWrapper\n   */\n  bitToBitWrapper(bit: BitJson): BitWrapperJson {\n    return {\n      bit,\n    };\n  }\n\n  private bitToAst(bit: BitJson, internalComments: string[] | undefined): Bit | undefined {\n    const { statement, reference: referenceBit, ...bitRest } = bit;\n\n    const isCommented = bit.type === BitType._comment && bit.originalType !== undefined;\n\n    // Bit type\n    const bitType = Config.getBitType(isCommented ? bit.originalType : bit.type);\n\n    // Get the bit config for the bit type\n    const bitConfig = Config.getBitConfig(bitType);\n\n    // Text Format\n    const deprecatedTextFormat = Enum(DeprecatedTextFormat).fromValue(bit.format);\n    let _textFormat = Enum(TextFormat).fromValue(bit.format) ?? bitConfig.textFormatDefault;\n    if (deprecatedTextFormat === DeprecatedTextFormat.bitmarkMinusMinus) {\n      _textFormat = TextFormat.bitmarkText;\n    }\n\n    // Build bit\n    const bitNode = builder.buildBit({\n      ...bitRest,\n      bitType,\n      bitLevel: Math.max(Math.min(bit.bitLevel ?? 1, Config.bitLevelMax), Config.bitLevelMin),\n      textFormat: bit.format as TextFormatType,\n      resourceType: this.getResourceType(bit.resource),\n      isCommented,\n      internalComment: internalComments,\n      ...this.processTitle(bitType, bit.title),\n      ...this.processReference(referenceBit), // reference and referenceProperty\n      ...this.parseExample(bit.example),\n      person: bit.partner ?? bit.person,\n      markConfig: bit.marks,\n      resources: this.processResources(bitType, bit.resource, bit.images, bit.logos),\n      body: this.processBody(bit.body as JsonText, bit.placeholders),\n      flashcards: bit.cards,\n      statements: this.processStatements(statement, bit.isCorrect, bit.statements, bit.example),\n      responses: this.processResponses(bitType, bit.responses as ResponseJson[]),\n      botResponses: this.processBotResponse(bitType, bit.responses as BotResponseJson[]),\n      cardBits: this.processListItems(\n        bit.listItems ?? bit.sections ?? bit.bookReferences,\n        bit.placeholders,\n      ),\n      footer: this.processFooter(bit.footer),\n    });\n\n    return bitNode;\n  }\n\n  private processStatements(\n    statement?: JsonText,\n    isCorrect?: boolean,\n    statements?: Partial<StatementJson>[],\n    example?: ExampleJson,\n  ): Partial<StatementJson>[] | undefined {\n    const nodes: Partial<StatementJson>[] = [];\n\n    // Add statement defined in the bit\n    if (statement) {\n      const node: Partial<StatementJson> = {\n        statement: statement ?? '',\n        isCorrect: isCorrect ?? false,\n        ...this.parseExample(example),\n      };\n\n      if (node) nodes.push(node);\n    }\n\n    // add standard statements\n    if (Array.isArray(statements)) for (const item of statements) nodes.push(item);\n\n    if (nodes.length === 0) return undefined;\n\n    return nodes;\n  }\n\n  private processResponses(\n    bitType: BitTypeType,\n    responses?: ResponseJson[],\n  ): ResponseJson[] | undefined {\n    // Return early if bot response as the responses should be interpreted as bot responses\n    if (Config.isOfBitType(bitType, BitType.botActionResponse)) return undefined;\n    if (!Array.isArray(responses)) return undefined;\n\n    return responses;\n  }\n\n  private processBotResponse(\n    bitType: BitTypeType,\n    responses?: BotResponseJson[],\n  ): BotResponseJson[] | undefined {\n    // Return early if NOT bot response as the responses should be interpreted as standard responses\n    if (!Config.isOfBitType(bitType, BitType.botActionResponse)) return undefined;\n    if (!Array.isArray(responses)) return undefined;\n    return responses;\n  }\n\n  private processListItems(\n    listItems: ListItemJson[],\n    placeholders: BodyBitsJson,\n  ): CardBit[] | undefined {\n    const nodes: CardBit[] = [];\n\n    if (Array.isArray(listItems)) {\n      for (const li of listItems) {\n        const node: CardBit = {\n          ...li,\n        } as CardBit;\n        if (node.body) {\n          node.body = {\n            body: node.body,\n            placeholders,\n          };\n        }\n        if (node) nodes.push(node);\n      }\n    }\n\n    if (nodes.length === 0) return undefined;\n\n    return nodes;\n  }\n\n  private getResourceType(resource?: ResourceJson): ResourceTypeType | undefined {\n    if (resource) {\n      const resourceKey = Enum(ResourceType).fromValue(resource.type);\n      return resourceKey;\n    }\n\n    return undefined;\n  }\n\n  private processResources(\n    bitType: BitTypeType,\n    resource: ResourceJson | undefined,\n    images: ImageResourceWrapperJson[] | undefined,\n    logos: ImageResourceWrapperJson[] | undefined,\n  ): ResourceJson[] | undefined {\n    const nodes: ResourceJson[] | undefined = [];\n\n    if (resource) nodes.push(resource);\n\n    if (Config.isOfBitType(bitType, [BitType.prototypeImages, BitType.extractorImage])) {\n      // Add the logo images\n      if (Array.isArray(images)) {\n        for (const image of images) {\n          if (image) nodes.push(image);\n        }\n      }\n    }\n\n    if (Config.isOfBitType(bitType, [BitType.imagesLogoGrave])) {\n      // Add the logo images\n      if (Array.isArray(logos)) {\n        for (const image of logos) {\n          if (image) nodes.push(image);\n        }\n      }\n    }\n\n    return nodes;\n  }\n\n  private processBody(body: JsonText, placeholders: BodyBitsJson): Body | undefined {\n    return {\n      body,\n      placeholders,\n    };\n  }\n\n  private processFooter(footerText: JsonText): Footer | undefined {\n    if (!footerText) return undefined;\n    return {\n      footer: footerText,\n    };\n  }\n\n  private processTitle(bitType: BitTypeType, title: JsonText): TitleAndTitleString {\n    if (Config.isOfBitType(bitType, BitType.author))\n      return {\n        titleString: title as string,\n        title: undefined,\n      };\n\n    return {\n      titleString: undefined,\n      title,\n    };\n  }\n\n  private processReference(reference: string | string[]): ReferenceAndReferenceProperty {\n    if (Array.isArray(reference) && reference.length > 0) {\n      return {\n        reference: undefined,\n        referenceProperty: reference,\n      };\n    }\n\n    return {\n      reference: reference as string,\n      referenceProperty: undefined,\n    };\n  }\n\n  private parseExample(example: ExampleJson | undefined): Example | undefined {\n    if (example == null) return undefined;\n    if (example === true) return { example: true };\n    if (example === false) return { example: false };\n    const exampleText =\n      StringUtils.isString(example) || Array.isArray(example) ? example : undefined;\n    if (exampleText) {\n      return { example: exampleText };\n    }\n    return { example: !!example };\n  }\n}\n\nexport { JsonParser };\n","/**\n * BitmarPegParserTypes.ts\n * RA Sewell\n *\n * (c) 2023 Get More Brain AG\n * All rights reserved.\n *\n */\n\nimport { type EnumType } from '@ncoderz/superenum';\n\nimport { type BreakscapedString } from '../../../model/ast/BreakscapedString.ts';\nimport {\n  type Body,\n  type CardBit,\n  type ExtraProperties,\n  type Footer,\n} from '../../../model/ast/Nodes.ts';\nimport { type JsonText, type TextAst } from '../../../model/ast/TextNodes.ts';\nimport { BitConfig } from '../../../model/config/BitConfig.ts';\nimport { type TagsConfig } from '../../../model/config/TagsConfig.ts';\nimport { type BitTypeType } from '../../../model/enum/BitType.ts';\nimport type { ResourceTypeType } from '../../../model/enum/ResourceType.ts';\nimport { Tag } from '../../../model/enum/Tag.ts';\nimport { type TextFormatType } from '../../../model/enum/TextFormat.ts';\nimport {\n  type BookJson,\n  type BotResponseJson,\n  type ChoiceJson,\n  type DefinitionListItemJson,\n  type ExampleJson,\n  type FeedbackChoiceJson,\n  type FeedbackJson,\n  type FlashcardJson,\n  type GroupTagJson,\n  type HeadingJson,\n  type ImageSourceJson,\n  type IngredientJson,\n  type MarkConfigJson,\n  type MatrixJson,\n  type PairJson,\n  type PersonJson,\n  type PronunciationTableJson,\n  type QuestionJson,\n  type QuizJson,\n  type RatingLevelStartEndJson,\n  type ResponseJson,\n  type ServingsJson,\n  type StatementJson,\n  type TableExtendedJson,\n  type TableJson,\n  type TechnicalTermJson,\n} from '../../../model/json/BitJson.ts';\nimport { type ImageResourceJson, type ResourceJson } from '../../../model/json/ResourceJson.ts';\nimport { type ParserData } from '../../../model/parser/ParserData.ts';\nimport { type ParserError } from '../../../model/parser/ParserError.ts';\nimport { type ParserInfo } from '../../../model/parser/ParserInfo.ts';\nimport { PeggyGrammarLocation } from './PeggyGrammarLocation.ts';\n\nconst CARD_DIVIDER_V2 = '====';\nconst CARD_SIDE_DIVIDER_V2 = '--';\nconst CARD_VARIANT_DIVIDER_V2 = '++';\n\nconst CARD_DIVIDER_V1 = '===';\nconst CARD_SIDE_DIVIDER_V1 = '==';\nconst CARD_VARIANT_DIVIDER_V1 = '--';\n\nexport interface ParseOptions {\n  startRule?: string;\n  grammarSource?: PeggyGrammarLocation | unknown;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  tracer?: any;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  [key: string]: any;\n}\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ParseFunction = (input: string, options?: ParseOptions) => any;\n\nexport interface ParserHelperOptions {\n  parse: ParseFunction;\n  parserText: () => ParserError['text'];\n  parserLocation: () => ParserError['location'];\n}\n\nexport interface SubParserResult<T> {\n  value?: T;\n  errors?: ParserError[];\n}\n\nexport interface RawTextAndResourceType {\n  textFormat?: string;\n  resourceType?: string;\n}\n\nexport interface BitHeader {\n  bitType: BitTypeType;\n  textFormat: TextFormatType;\n  resourceType?: ResourceTypeType;\n  bitLevel: number;\n  isCommented?: boolean;\n}\n\nexport interface TrueFalseValue {\n  text: string;\n  textAst: TextAst;\n  isCorrect: boolean;\n  example?: ExampleJson;\n  __isDefaultExample: boolean;\n}\n\nexport interface CardData {\n  cardIndex: number;\n  cardSideIndex: number;\n  cardVariantIndex: number;\n  value: string;\n  cardQualifier?: string;\n  cardSideQualifier?: string;\n  cardVariantQualifier?: string;\n}\n\nexport interface BitContentProcessorResult {\n  cardSet?: ParsedCardSet;\n  cardBody?: Body;\n  cardBodyStr?: string;\n  body?: Body;\n  footer?: Footer;\n  tableCellType?: string;\n  tableRowSpan?: number;\n  tableColSpan?: number;\n  tableScope?: string;\n  tableColWidth?: number;\n  sourceBB?: number[][];\n  groupTag?: Partial<GroupTagJson>[];\n  tag?: string[];\n  imageSource?: Partial<ImageSourceJson>;\n  technicalTerm?: Partial<TechnicalTermJson>;\n  servings?: Partial<ServingsJson>;\n  ratingLevelStart?: Partial<RatingLevelStartEndJson>;\n  ratingLevelEnd?: Partial<RatingLevelStartEndJson>;\n  label?: TextAst;\n  person?: Partial<PersonJson>;\n  propertyTitle?: BreakscapedString;\n  trueFalse?: TrueFalseValue[];\n  lang?: BreakscapedString;\n  example?: ExampleJson;\n  isCorrect?: boolean;\n  markConfig?: Partial<MarkConfigJson>[];\n  solutions?: string[];\n  __solutionsAst?: TextAst[];\n  statement?: Partial<StatementJson>;\n  statements?: Partial<StatementJson>[];\n  feedbackChoices?: Partial<FeedbackChoiceJson>[];\n  choices?: Partial<ChoiceJson>[];\n  responses?: Partial<ResponseJson>[];\n  solution?: BreakscapedString;\n  mark?: BreakscapedString[];\n  title?: { titleAst: TextAst; titleString: string }[];\n  // title?: TextAst[];\n  // subtitle?: BreakscapedString;\n  propertyStyleResources?: { [key: string]: ResourceJson | ResourceJson[] };\n  resources?: ResourceJson[];\n  itemLead?: TextAst[];\n  __itemLeadString?: (string | undefined)[];\n  item?: JsonText;\n  __itemString?: string;\n  lead?: TextAst;\n  __leadString?: string;\n  pageNumber?: TextAst;\n  __pageNumberString?: string;\n  marginNumber?: TextAst;\n  __marginNumberString?: string;\n  instruction?: TextAst;\n  __instructionString?: string;\n  hint?: TextAst;\n  __hintString?: string;\n  anchor?: string;\n  book?: string | BookJson[];\n  reference?: string;\n  referenceEnd?: string;\n  sampleSolution?: string;\n  __sampleSolutionAst?: TextAst;\n  additionalSolutions?: string[];\n  isCaseSensitive?: boolean;\n  reaction?: BreakscapedString;\n  license?: string;\n  copyright?: string;\n  showInIndex?: boolean;\n  caption?: TextAst;\n  src1x?: string;\n  src2x?: string;\n  src3x?: string;\n  src4x?: string;\n  width?: string;\n  height?: string;\n  alt?: string;\n  // duration?: BreakscapedString | BreakscapedString[]; // number? - there is a collision between duration at bit level, and duration in resource.\n  mute?: boolean;\n  autoplay?: boolean;\n  allowSubtitles?: boolean;\n  showSubtitles?: boolean;\n  posterImage?: /*ImageResourceJson |*/ string;\n  siteName?: string;\n  imageSourceUrl?: string;\n  image?: Partial<ImageResourceJson>;\n  mockupId?: BreakscapedString;\n  size?: number;\n  format?: BreakscapedString;\n  unit?: BreakscapedString;\n  unitPlural?: BreakscapedString;\n  unitAbbr?: BreakscapedString;\n  unitAbbrPlural?: BreakscapedString;\n  decimalPlaces?: number;\n  disableCalculation?: boolean;\n\n  extraProperties?: ExtraProperties;\n  internalComments?: BreakscapedString[];\n\n  __isDefaultExample?: boolean;\n}\n\nexport interface BitSpecificTitles {\n  title?: TextAst;\n  titleString?: string;\n  subtitle?: TextAst;\n  subtitleString?: string;\n  level?: number;\n}\n\nexport interface StatementsOrChoicesOrResponses {\n  statements?: Partial<StatementJson>[];\n  choices?: Partial<ChoiceJson>[];\n  responses?: Partial<ResponseJson>[];\n}\n\nexport interface BitSpecificCards {\n  sampleSolution?: string; // ??\n  elements?: JsonText[];\n  flashcards?: Partial<FlashcardJson>[];\n  definitions?: Partial<DefinitionListItemJson>[];\n  statements?: Partial<StatementJson>[];\n  responses?: Partial<ResponseJson>[];\n  feedbacks?: Partial<FeedbackJson>[];\n  quizzes?: Partial<QuizJson>[];\n  heading?: Partial<HeadingJson>;\n  pairs?: Partial<PairJson>[];\n  matrix?: Partial<MatrixJson>[];\n  choices?: Partial<ChoiceJson>[];\n  questions?: Partial<QuestionJson>[];\n  pronunciationTable?: Partial<PronunciationTableJson>;\n  table?: Partial<TableJson | TableExtendedJson>;\n  botResponses?: Partial<BotResponseJson>[];\n  ingredients?: Partial<IngredientJson>[];\n  // DEPRECATED - TO BE REMOVED IN THE FUTURE\n  // captionDefinitionList?: Partial<CaptionDefinitionListJson>;\n  cardBits?: Partial<CardBit>[];\n  internalComments?: string[]; // ??\n}\n\nexport type BitContent = TypeValue | TypeKeyValue;\n\nexport interface TypeValue<T = unknown> extends ParserData {\n  type: string;\n  value?: T;\n  chain?: BitContent[];\n}\n\nexport interface TypeKeyValue<T = unknown> extends ParserData {\n  type: string;\n  key: string;\n  value?: T;\n  chain?: BitContent[];\n}\n\nconst TypeKey = {\n  // Bit header\n  TextFormat: 'TextFormat',\n  ResourceType: 'ResourceType',\n\n  // Tags (NOTE: ALL TAGS MUST USE THEIR CORRECT BITMARK REPRESENTATION HERE so they work with the rest of the code)\n  Title: Tag.tag_title,\n  Anchor: Tag.tag_anchor,\n  Reference: Tag.tag_reference,\n  ItemLead: Tag.tag_item,\n  Instruction: Tag.tag_instruction,\n  Hint: Tag.tag_hint,\n  True: Tag.tag_true,\n  False: Tag.tag_false,\n  Gap: Tag.tag_gap,\n  Mark: Tag.tag_mark,\n  SampleSolution: Tag.tag_sampleSolution,\n\n  // Generic Tags (converted to specific tags by the BitTagValidator)\n  Property: 'Property',\n  Resource: 'Resource',\n  TagChain: 'TagChain',\n\n  // Text\n  BodyChar: 'BodyChar',\n  BodyText: 'BodyText',\n  BodyTextPlain: 'BodyTextPlain',\n\n  // Card Set\n  CardSet: 'CardSet',\n  Card: 'Card',\n  CardChar: 'CardChar',\n  CardText: 'CardText',\n\n  // Chains\n  GapChain: 'GapChain',\n  TrueFalseChain: 'TrueFalseChain',\n\n  // Dividers\n  PlainTextDivider: 'PlainTextDivider',\n  FooterDivider: 'FooterDivider',\n} as const;\n\nexport type TypeKeyType = EnumType<typeof TypeKey>;\n\nconst ContentDepth = {\n  Bit: 'Bit',\n  Card: 'Card',\n  Chain: 'Chain',\n} as const;\n\nexport type ContentDepthType = EnumType<typeof ContentDepth>;\n\n// Card Set\n\nexport interface UnparsedCardSet {\n  cards: UnparsedCard[];\n}\n\nexport interface UnparsedCard {\n  sides: UnparsedCardSide[];\n  qualifier?: string;\n}\n\nexport interface UnparsedCardSide {\n  variants: UnparsedCardContent[];\n  qualifier?: string;\n}\n\ninterface UnparsedCardContent extends ParserData {\n  value: string;\n  qualifier?: string;\n}\n\nexport interface ParsedCardSet {\n  cards: ParsedCard[];\n}\n\nexport interface ParsedCard {\n  sides: ParsedCardSide[];\n  qualifier?: string;\n}\n\nexport interface ParsedCardSide {\n  variants: ParsedCardContent[];\n  qualifier?: string;\n}\n\ninterface ParsedCardContent extends ParserData {\n  content: BitContent[];\n  qualifier?: string;\n}\n\nexport interface ProcessedCardSet {\n  cards: ProcessedCard[];\n  internalComments: BreakscapedString[];\n}\n\nexport interface ProcessedCard {\n  no: number;\n  sides: ProcessedCardSide[];\n  qualifier?: string;\n}\n\nexport interface ProcessedCardSide {\n  no: number;\n  variants: ProcessedCardVariant[];\n  qualifier?: string;\n}\n\nexport interface ProcessedCardVariant extends ParserData {\n  no: number;\n  data: BitContentProcessorResult;\n  qualifier?: string;\n}\n\n// Context\n\nexport interface BitmarkPegParserContext {\n  bitConfig: BitConfig;\n  bitType: BitTypeType;\n  textFormat: TextFormatType;\n  resourceType?: ResourceTypeType;\n\n  DEBUG_BIT_RAW: boolean;\n  DEBUG_BIT_CONTENT_RAW: boolean;\n  DEBUG_BIT_CONTENT: boolean;\n  DEBUG_BIT_TAGS: boolean;\n  DEBUG_BODY: boolean;\n  DEBUG_FOOTER: boolean;\n  DEBUG_CHAIN_CONTENT: boolean;\n  DEBUG_CHAIN_TAGS: boolean;\n  DEBUG_CARD_SET_CONTENT: boolean;\n  DEBUG_CARD_SET: boolean;\n  DEBUG_CARD_TAGS: boolean;\n\n  parser: ParserInfo;\n\n  parse: ParseFunction;\n  bitContentProcessor(\n    contentDepth: ContentDepthType,\n    tagsConfig: TagsConfig | undefined,\n    data: BitContent[] | undefined,\n  ): BitContentProcessorResult;\n  splitBitContent(bitContent: BitContent[], types: TypeKeyType[]): BitContent[][];\n  addWarning(message: string, parserData?: ParserData, parserDataOriginal?: ParserData): void;\n  addError(message: string, parserData?: ParserData, parserDataOriginal?: ParserData): void;\n  debugPrint(header: string, data: unknown): void;\n\n  // Parser global parse state\n  state: object;\n}\n\nexport {\n  ContentDepth as BitContentLevel,\n  CARD_DIVIDER_V1,\n  CARD_DIVIDER_V2,\n  CARD_SIDE_DIVIDER_V1,\n  CARD_SIDE_DIVIDER_V2,\n  CARD_VARIANT_DIVIDER_V1,\n  CARD_VARIANT_DIVIDER_V2,\n  TypeKey,\n};\n","import { type ParserLocation } from '../../../model/parser/ParserLocation.ts';\nimport { type ParserLocationRange } from '../../../model/parser/ParserLocationRange.ts';\n\n/**\n * Sourced from: https://github.com/peggyjs/peggy/blob/cdf878e4ee59ab9d3e5199abb87ef34a8d7ce642/lib/grammar-location.js\n *\n * Included here to avoid having to import peggy as a dependency, as adding peggy as a dependency significantly\n * increases the size of the browser bundle (by 40kB or nearly double).\n *\n * When used as a grammarSource, allows grammars embedded in larger files to\n * specify their offset.  The start location is the first character in the\n * grammar.  The first line is often moved to the right by some number of\n * columns, but subsequent lines all start at the first column.\n */\nclass PeggyGrammarLocation {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  public source: any;\n  public start: ParserLocation;\n\n  /**\n   * Create an instance.\n   *\n   * @param {any} source The original grammarSource.  Should be a string or\n   *   have a toString() method.\n   * @param {import(\"./peg\").Location} start The starting offset for the\n   *   grammar in the larger file.\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  constructor(source: any, start: ParserLocation) {\n    this.source = source;\n    this.start = start;\n  }\n\n  /**\n   * Coerce to a string.\n   *\n   * @returns {string} The source, stringified.\n   */\n  toString(): string {\n    return String(this.source);\n  }\n\n  /**\n   * Return a new Location offset from the given location by the start of the\n   * grammar.\n   *\n   * loc The location as if the start of the\n   *   grammar was the start of the file.\n   *  The offset location.\n   */\n  offset(loc: ParserLocation): ParserLocation {\n    return {\n      line: loc.line + this.start.line - 1,\n      column: loc.line === 1 ? loc.column + this.start.column - 1 : loc.column,\n      offset: loc.offset + this.start.offset,\n    };\n  }\n\n  /**\n   * If the range has a grammarSource that is a GrammarLocation, offset the\n   * start of that range by the GrammarLocation.\n   *\n   * @param range The range to extract from.\n   * @returns The offset start if possible, or the\n   *   original start.\n   */\n  static offsetStart(range: ParserLocationRange): ParserLocation {\n    if (range.source && typeof range.source.offset === 'function') {\n      return range.source.offset(range.start);\n    }\n    return range.start;\n  }\n\n  /**\n   * If the range has a grammarSource that is a GrammarLocation, offset the\n   * end of that range by the GrammarLocation.\n   *\n   * @param range The range to extract from.\n   * @returns The offset end if possible, or the\n   *   original end.\n   */\n  static offsetEnd(range: ParserLocationRange): ParserLocation {\n    if (range.source && typeof range.source.offset === 'function') {\n      return range.source.offset(range.end);\n    }\n    return range.end;\n  }\n}\n\nexport { PeggyGrammarLocation };\n","/**\n * BitmarkPegParserProcessor.ts\n * RA Sewell\n *\n * (c) 2023-25 Get More Brain AG\n * All rights reserved.\n *\n *\n * Debugging and Development\n * -------------------------\n *\n * - To build the parser, run 'yarn build-grammar-bit'\n * - Modify the bitmark in '_simple.bitmark' to test the parser (this will be parsed after building the parser)\n * - To undersand the operation and to help debug and develop, use the DEBUG_XXX flags in the code below\n *   and in BitmarkPegParserProcessor.ts\n *\n */\n\nimport '../../../config/Config.ts';\n\nimport { Enum } from '@ncoderz/superenum';\n\nimport { Breakscape } from '../../../breakscaping/Breakscape.ts';\nimport { type BreakscapedString } from '../../../model/ast/BreakscapedString.ts';\nimport { type Bit } from '../../../model/ast/Nodes.ts';\nimport { CardSetVersion } from '../../../model/enum/CardSetVersion.ts';\nimport { Tag } from '../../../model/enum/Tag.ts';\nimport { TextFormat } from '../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../model/enum/TextLocation.ts';\nimport { type ParserError } from '../../../model/parser/ParserError.ts';\nimport { type ParserLocation } from '../../../model/parser/ParserLocation.ts';\nimport { StringUtils } from '../../../utils/StringUtils.ts';\nimport {\n  type ParsedCard,\n  type ParsedCardSet,\n  type ParsedCardSide,\n  type ParseFunction,\n  type SubParserResult,\n  type UnparsedCardSet,\n} from './BitmarkPegParserTypes.ts';\nimport {\n  type BitContent,\n  CARD_DIVIDER_V1,\n  CARD_DIVIDER_V2,\n  CARD_SIDE_DIVIDER_V1,\n  CARD_SIDE_DIVIDER_V2,\n  CARD_VARIANT_DIVIDER_V1,\n  CARD_VARIANT_DIVIDER_V2,\n  type CardData,\n  type ParserHelperOptions,\n  TypeKey,\n  type TypeKeyType,\n  type TypeValue,\n} from './BitmarkPegParserTypes.ts';\nimport { PeggyGrammarLocation } from './PeggyGrammarLocation.ts';\n\nconst ENABLE_DEBUG = true;\nconst DEBUG_DATA = true;\nconst DEBUG_DATA_INCLUDE_PARSER = false;\nconst DEBUG_TRACE_RAW_BIT = true;\nconst DEBUG_TRACE_TEXT_FORMAT = false;\nconst DEBUG_TRACE_RESOURCE_TYPE = false;\nconst DEBUG_TRACE_BIT_CONTENT = false;\nconst DEBUG_TRACE_BIT_TAG = false;\nconst DEBUG_TRACE_TAGS = false;\nconst DEBUG_TRACE_PROPERTY_TAGS = false;\nconst DEBUG_TRACE_RESOURCE_TAGS = false;\nconst DEBUG_TRACE_TAGS_CHAIN = false;\nconst DEBUG_TRACE_CARD_SET = false;\nconst DEBUG_TRACE_CARD_SET_START = false;\nconst DEBUG_TRACE_CARD_SET_END = false;\nconst DEBUG_TRACE_CARD_LINE_OR_DIVIDER = false;\nconst DEBUG_TRACE_CARD_CONTENT = false;\nconst DEBUG_TRACE_CARD_TAGS = false;\nconst DEBUG_TRACE_CARD_PARSED = true; // Print the parsed card (will create a lot of output if card value is large)\nconst DEBUG = ENABLE_DEBUG && process.env.BPG_ENV === 'development';\n\nclass BitmarkPegParserHelper {\n  private cardIndex = 0;\n  private cardSideIndex = 0;\n  private cardVariantIndex = 0;\n  private currentCardQualifier: string | undefined;\n  private currentSideQualifier: string | undefined;\n  private currentVariantQualifier: string | undefined;\n\n  private parse: ParseFunction;\n  private parserText: () => ParserError['text'];\n  private parserLocation: () => ParserError['location'];\n\n  constructor(options: ParserHelperOptions) {\n    this.parse = options.parse;\n    this.parserText = options.parserText;\n    this.parserLocation = options.parserLocation;\n  }\n\n  //\n  // PARSING\n  //\n\n  handleRawBit(rawBit: string): SubParserResult<Bit> | undefined {\n    const rawBitTrimmed = rawBit.trim();\n\n    if (DEBUG_TRACE_RAW_BIT) this.debugPrint('RAW BIT', rawBitTrimmed);\n\n    // Ignore empty bits (only happens if entire file is empty / whitespace only\n    if (!rawBitTrimmed) return undefined;\n\n    // Get current parser location\n    const location = this.parserLocation()?.start ?? {\n      line: 1,\n      column: 1,\n      offset: 0,\n    };\n\n    // Parse the raw bit\n    const bitParserResult = this.parse(rawBit, {\n      startRule: 'bit',\n      grammarSource: new PeggyGrammarLocation('bit', location),\n    }) as SubParserResult<Bit>;\n\n    // Add markup to the bit result\n    if (bitParserResult.value) bitParserResult.value.markup = rawBitTrimmed;\n\n    return bitParserResult;\n  }\n\n  handleTextFormat(value: unknown): BitContent {\n    if (DEBUG_TRACE_TEXT_FORMAT) this.debugPrint(TypeKey.TextFormat, value);\n    return {\n      type: TypeKey.TextFormat,\n      value,\n      parser: {\n        text: this.parserText(),\n        location: this.parserLocation(),\n      },\n    };\n  }\n\n  handleResourceType(value: unknown): BitContent {\n    if (DEBUG_TRACE_RESOURCE_TYPE) this.debugPrint(TypeKey.ResourceType, value);\n    return {\n      type: TypeKey.ResourceType,\n      value,\n      parser: {\n        text: this.parserText(),\n        location: this.parserLocation(),\n      },\n    };\n  }\n\n  handleBitContent(value: unknown): BitContent[] {\n    if (DEBUG_TRACE_BIT_CONTENT) this.debugPrint('BitContent', value);\n\n    let content = this.reduceToArrayOfTypes(value);\n\n    // Merge the BodyChar to BodyText\n    content = this.mergeCharToText(content);\n\n    return content;\n  }\n\n  //\n  // Bit tags parsing\n  //\n\n  handleBitTag(value: BitContent): BitContent {\n    if (DEBUG_TRACE_BIT_TAG) this.debugPrint('BitTag', value);\n    return value;\n  }\n\n  handleTag(type: TypeKeyType, value: unknown): BitContent {\n    if (DEBUG_TRACE_TAGS) this.debugPrint(type, { value });\n\n    // if (type === TypeKey.Comment) {\n    //   debugger;\n    // }\n\n    return {\n      type,\n      key: Enum(Tag).fromValue(type),\n      value,\n      parser: {\n        text: this.parserText(),\n        location: this.parserLocation(),\n      },\n    };\n  }\n\n  handlePropertyTag(key: BreakscapedString, value: unknown): BitContent {\n    if (DEBUG_TRACE_PROPERTY_TAGS) this.debugPrint(TypeKey.Property, { key, value });\n\n    return {\n      type: TypeKey.Property,\n      key: `@${Breakscape.unbreakscape(key, {\n        format: TextFormat.plainText,\n        location: TextLocation.tag,\n      })}`,\n      value,\n      parser: {\n        text: this.parserText(),\n        location: this.parserLocation(),\n      },\n    };\n  }\n\n  handleResourceTag(key: BreakscapedString, value: unknown): BitContent {\n    if (DEBUG_TRACE_RESOURCE_TAGS) this.debugPrint(TypeKey.Resource, { key, value });\n\n    const uKey = Breakscape.unbreakscape(key, {\n      format: TextFormat.plainText,\n      location: TextLocation.tag,\n    });\n    const camelKey = StringUtils.kebabToCamel(uKey);\n\n    return {\n      type: TypeKey.Resource,\n      key: `&${camelKey}`,\n      value,\n      parser: {\n        text: this.parserText(),\n        location: this.parserLocation(),\n      },\n    };\n  }\n\n  handleTagChain(value: unknown): BitContent[] {\n    if (DEBUG_TRACE_TAGS_CHAIN) this.debugPrint('TagsChain', value);\n    const content = this.reduceToArrayOfTypes(value);\n    let newContent: BitContent[] = content;\n\n    if (content.length > 1) {\n      const head = content[0];\n      head.chain = content.slice(1);\n      newContent = [head];\n    }\n\n    return newContent;\n  }\n\n  //\n  // Divider parsing\n  //\n\n  // Plain text divider\n  handlePlainTextDivider(value: unknown): BitContent {\n    value = this.reduceToString(value);\n\n    return {\n      type: TypeKey.PlainTextDivider,\n      value,\n      parser: {\n        text: this.parserText(),\n        location: this.parserLocation(),\n      },\n    };\n  }\n\n  // Footer divider\n  handleFooterDivider(value: unknown): BitContent {\n    value = this.reduceToString(value);\n\n    return {\n      type: TypeKey.FooterDivider,\n      value,\n      parser: {\n        text: this.parserText(),\n        location: this.parserLocation(),\n      },\n    };\n  }\n\n  //\n  // Card parsing\n  //\n\n  handleCardSet(value: unknown): BitContent {\n    if (DEBUG_TRACE_CARD_SET) this.debugPrint(TypeKey.CardSet, value);\n\n    // Build card set\n    const cards = value as BitContent[];\n    const unparsedCardSet: UnparsedCardSet = {\n      cards: [],\n    };\n    const cardSet: ParsedCardSet = {\n      cards: [],\n    };\n\n    if (cards) {\n      // Get current parser location\n      const parser = {\n        text: this.parserText(),\n        location: this.parserLocation(),\n      };\n\n      for (const content of cards) {\n        if (!content) continue;\n        const { type, value: cardData, parser } = content as TypeValue;\n        if (!type || type !== TypeKey.Card) continue;\n        const {\n          cardIndex,\n          cardSideIndex,\n          cardVariantIndex: cardContentIndex,\n          value,\n          cardQualifier,\n          cardSideQualifier,\n          cardVariantQualifier,\n        } = cardData as CardData;\n\n        // Get or create card\n        let card = unparsedCardSet.cards[cardIndex];\n        if (!card) {\n          card = {\n            sides: [],\n            qualifier: cardQualifier,\n          };\n          unparsedCardSet.cards[cardIndex] = card;\n        } else if (cardQualifier && !card.qualifier) {\n          card.qualifier = cardQualifier;\n        }\n\n        // Get or create side\n        let side = card.sides[cardSideIndex];\n        if (!side) {\n          side = {\n            variants: [],\n            qualifier: cardSideQualifier,\n          };\n          card.sides[cardSideIndex] = side;\n        } else if (cardSideQualifier && !side.qualifier) {\n          side.qualifier = cardSideQualifier;\n        }\n\n        // Set variant value\n        const variant = side.variants[cardContentIndex];\n        if (!variant) {\n          side.variants[cardContentIndex] = {\n            value,\n            parser,\n            qualifier: cardVariantQualifier,\n          };\n        } else {\n          side.variants[cardContentIndex].value += value;\n          if (cardVariantQualifier && !variant.qualifier) {\n            variant.qualifier = cardVariantQualifier;\n          }\n        }\n      }\n\n      // Remove any completely empty cards\n      unparsedCardSet.cards = unparsedCardSet.cards.filter((card) => {\n        return card.sides.some((side) => {\n          return side.variants.some((variant) => {\n            const trimmed = StringUtils.trimmedString(variant.value);\n            return trimmed.length !== 0;\n          });\n        });\n      });\n\n      // Parse the card data\n      for (const unparsedCard of unparsedCardSet.cards) {\n        const card = {\n          sides: [],\n          qualifier: unparsedCard.qualifier,\n        } as ParsedCard;\n        cardSet.cards.push(card);\n        for (const unparsedSide of unparsedCard.sides) {\n          const side = {\n            variants: [],\n            qualifier: unparsedSide.qualifier,\n          } as ParsedCardSide;\n          card.sides.push(side);\n          for (const unparsedContent of unparsedSide.variants) {\n            // Get current parser location\n            // It must be modified by the length of the divider to be correct as the text in 'unparsedContent.value'\n            // have the divider removed.\n            let location: ParserLocation = {\n              line: 1,\n              column: 1,\n              offset: 0,\n            };\n            if (unparsedContent.parser.location) {\n              location = unparsedContent.parser.location.start;\n              const text = unparsedContent.parser.text;\n              const offsetCorrection = text ? text.length : 0;\n              const lineCorrection = 1;\n              location.offset += offsetCorrection;\n              location.line += lineCorrection;\n            }\n\n            // Run the parser on the card content\n            let content = this.parse(unparsedContent.value, {\n              startRule: 'cardContent',\n              grammarSource: new PeggyGrammarLocation('card-content', location),\n            }) as BitContent[];\n\n            content = this.reduceToArrayOfTypes(content);\n\n            if (DEBUG_TRACE_CARD_PARSED) this.debugPrint('parsedCardContent', content);\n\n            side.variants.push({\n              parser,\n              content,\n              qualifier: unparsedContent.qualifier,\n            });\n          }\n        }\n      }\n    }\n\n    return {\n      type: TypeKey.CardSet,\n      value: cardSet,\n      parser: {\n        text: this.parserText(),\n        location: this.parserLocation(),\n      },\n    };\n  }\n\n  handleCardSetStart() {\n    if (DEBUG_TRACE_CARD_SET_START) this.debugPrint('CardSetStart');\n\n    this.cardIndex = -1; // Incremented by first card divider to 0 for first card\n    this.cardSideIndex = 0;\n    this.cardVariantIndex = 0;\n    this.currentCardQualifier = undefined;\n    this.currentSideQualifier = undefined;\n    this.currentVariantQualifier = undefined;\n  }\n\n  handleCardSetEnd() {\n    if (DEBUG_TRACE_CARD_SET_END) this.debugPrint('CardSetEnd');\n    // console.log('CardSetEnd');\n    this.cardIndex = 0;\n    this.cardSideIndex = 0;\n    this.cardVariantIndex = 0;\n    this.currentCardQualifier = undefined;\n    this.currentSideQualifier = undefined;\n    this.currentVariantQualifier = undefined;\n  }\n\n  handleCards(value: unknown): unknown {\n    // console.log('Cards');\n    return value;\n  }\n\n  handleCardLineOrDivider(value: unknown, version: number) {\n    if (DEBUG_TRACE_CARD_LINE_OR_DIVIDER) this.debugPrint('CardLineOrDivider', value);\n\n    let isCardDivider = false;\n    let isSideDivider = false;\n    let isVariantDivider = false;\n    let qualifier: string | undefined;\n\n    if (Array.isArray(value) && value.length === 2) {\n      const [divider, maybeQualifier] = value as [unknown, unknown];\n      if (typeof divider === 'string') {\n        value = divider;\n        if (\n          typeof maybeQualifier === 'string' &&\n          maybeQualifier.trim() === maybeQualifier &&\n          maybeQualifier.length > 0\n        ) {\n          qualifier = maybeQualifier;\n        }\n      } else {\n        value = divider;\n      }\n    } else if (Array.isArray(value) && value.length === 1) {\n      const [divider] = value as [unknown];\n      value = divider;\n    }\n\n    if (version === CardSetVersion.v1) {\n      isCardDivider = value === CARD_DIVIDER_V1;\n      isSideDivider = value === CARD_SIDE_DIVIDER_V1;\n      isVariantDivider = value === CARD_VARIANT_DIVIDER_V1;\n    } else {\n      isCardDivider = value === CARD_DIVIDER_V2;\n      isSideDivider = value === CARD_SIDE_DIVIDER_V2;\n      isVariantDivider = value === CARD_VARIANT_DIVIDER_V2;\n    }\n\n    if (isCardDivider) {\n      this.cardIndex++;\n      this.cardSideIndex = 0;\n      this.cardVariantIndex = 0;\n      this.currentCardQualifier = qualifier;\n      this.currentSideQualifier = undefined;\n      this.currentVariantQualifier = undefined;\n    } else if (isSideDivider) {\n      this.cardSideIndex++;\n      this.cardVariantIndex = 0;\n      this.currentSideQualifier = qualifier;\n      this.currentVariantQualifier = undefined;\n      // console.log(`Card ${this.cardIndex} Side: ${value}`);\n    } else if (isVariantDivider) {\n      this.cardVariantIndex++;\n      this.currentVariantQualifier = qualifier;\n      // console.log(`Card ${this.cardIndex}, Side ${this.cardSideIndex}, Variant: ${this.cardVariantIndex}`);\n    }\n\n    if (this.isType(value, TypeKey.Card)) return value;\n\n    return {\n      type: TypeKey.Card,\n      value: {\n        cardIndex: this.cardIndex,\n        cardSideIndex: this.cardSideIndex,\n        cardVariantIndex: this.cardVariantIndex,\n        value: '',\n        cardQualifier: this.currentCardQualifier,\n        cardSideQualifier: this.currentSideQualifier,\n        cardVariantQualifier: this.currentVariantQualifier,\n      } as CardData,\n      parser: {\n        text: this.parserText(),\n        location: this.parserLocation(),\n      },\n    };\n  }\n\n  handleCardLine(value: unknown) {\n    if (DEBUG_TRACE_CARD_LINE_OR_DIVIDER) {\n      this.debugPrint(\n        'CardLine',\n        `(Card ${this.cardIndex}, Side ${this.cardSideIndex}, Variant: ${this.cardVariantIndex}): ${value}`,\n      );\n    }\n\n    return {\n      type: TypeKey.Card,\n      value: {\n        cardIndex: this.cardIndex,\n        cardSideIndex: this.cardSideIndex,\n        cardVariantIndex: this.cardVariantIndex,\n        value,\n        cardQualifier: this.currentCardQualifier,\n        cardSideQualifier: this.currentSideQualifier,\n        cardVariantQualifier: this.currentVariantQualifier,\n      } as CardData,\n      parser: {\n        text: this.parserText(),\n        location: this.parserLocation(),\n      },\n    };\n  }\n\n  handleCardContent(value: BitContent[]): BitContent[] {\n    if (DEBUG_TRACE_CARD_CONTENT) this.debugPrint('CardContent', value);\n\n    // Merge the BodyChar to BodyText\n    const content = this.mergeCharToText(value);\n\n    return content;\n  }\n\n  handleCardTags(value: unknown): unknown {\n    if (DEBUG_TRACE_CARD_TAGS) this.debugPrint('CardTags', value);\n\n    return value;\n  }\n\n  //\n  // Util functions\n  //\n\n  /**\n   * Merge types:\n   *  - BodyChar => BodyText\n   *  - CardChar => CardText\n   *\n   * Any adjacent BodyChar or CardChar are merged into a single BodyText or CardText\n   *\n   * @param bitContent\n   */\n  private mergeCharToText(bitContent: BitContent[]) {\n    const bc: BitContent[] = [];\n    let bodyText: TypeValue | undefined;\n    let cardText: TypeValue | undefined;\n\n    for (const c of bitContent) {\n      switch (c.type) {\n        case TypeKey.BodyChar: {\n          if (bodyText) {\n            const val = `${bodyText.value ?? ''}${c.value ?? ''}`;\n            bodyText.value = val;\n          } else {\n            bodyText = {\n              type: TypeKey.BodyText,\n              value: c.value ?? '',\n              parser: {\n                text: this.parserText(),\n                location: this.parserLocation(),\n              },\n            };\n          }\n          break;\n        }\n\n        case TypeKey.CardChar: {\n          if (cardText) {\n            const val = `${cardText.value ?? ''}${c.value ?? ''}`;\n            cardText.value = val;\n          } else {\n            cardText = {\n              type: TypeKey.CardText,\n              value: c.value ?? '',\n              parser: {\n                text: this.parserText(),\n                location: this.parserLocation(),\n              },\n            };\n          }\n          break;\n        }\n\n        default: {\n          if (bodyText) {\n            bc.push(bodyText);\n            bodyText = undefined;\n          }\n          if (cardText) {\n            bc.push(cardText);\n            cardText = undefined;\n          }\n          bc.push(c);\n        }\n      }\n    }\n\n    // Add the last bodyText or cardText\n    if (bodyText) bc.push(bodyText);\n    if (cardText) bc.push(cardText);\n\n    return bc;\n  }\n\n  /**\n   * Returns true if a value is a TypeKeyValue or TypeKey type with a type in the given types\n   *\n   * @param value The value to check\n   * @param validType The type or types to check, or undefined to check for any type\n   * @returns True if the value is a TypeKeyValue or TypeKey type with a type in the given types, otherwise False.\n   */\n  private isType(value: unknown, validType?: TypeKeyType | TypeKeyType[]): boolean {\n    if (!value) return false;\n    const { type } = value as TypeValue;\n\n    if (!validType) {\n      return !!Enum(TypeKey).fromValue(type as TypeKeyType);\n    }\n    if (Array.isArray(validType)) {\n      return validType.indexOf(type as TypeKeyType) >= 0;\n    }\n\n    return validType === type;\n  }\n\n  /**\n   * Reduce the data to type objects.\n   *\n   * The input data can have any structure. It will be reduced to an array of BitContent objects.\n   *\n   * @param data the data to reduce\n   * @param validTypes types include in the reduced data\n   * @param recurseIntoTypes set to true to reduce types which have array values\n   * @returns an array of BitContent objects reduced from the input data\n   */\n  private reduceToArrayOfTypes(\n    data: unknown,\n    validTypes?: TypeKeyType[],\n    recurseIntoTypes?: boolean,\n  ): BitContent[] {\n    if (!Array.isArray(data)) return [];\n\n    const res = data.reduce((acc, content, _index) => {\n      if (content == null) return acc;\n      const { type, value } = content as TypeValue;\n\n      if (Array.isArray(content)) {\n        // Not a TypeKeyValue - recurse\n        const subValues = this.reduceToArrayOfTypes(content, validTypes);\n        acc.push(...subValues);\n      } else {\n        if (!this.isType(content, validTypes)) return acc;\n\n        if (recurseIntoTypes && Array.isArray(value)) {\n          // Not a TypeKeyValue - recurse\n          const subValues = this.reduceToArrayOfTypes(value, validTypes);\n          acc.push(...subValues);\n        } else if (type) {\n          acc.push(content);\n        }\n      }\n\n      return acc;\n    }, [] as BitContent[]);\n\n    return res;\n  }\n\n  /**\n   * Reduce the data to a string.\n   *\n   * The input data can have any nested array structure. It will be reduced to a single string.\n   *\n   * @param data the data to reduce\n   * @returns a string concatenated from all the string values in the input data\n   */\n  private reduceToString(data: unknown): string {\n    if (!Array.isArray(data)) return '';\n\n    const res = data.reduce((acc, content, _index) => {\n      if (content == null) return acc;\n\n      if (Array.isArray(content)) {\n        // An array - recurse\n        const subValue = this.reduceToString(content);\n        acc += subValue;\n      } else {\n        acc += content;\n      }\n\n      return acc;\n    }, [] as BitContent[]);\n\n    return res;\n  }\n\n  /**\n   * Print out data for debugging\n   *\n   * @param header\n   * @param data\n   */\n  private debugPrint(header: string, data?: unknown): void {\n    /* STRIP:START */\n    if (DEBUG) {\n      if (DEBUG_DATA) {\n        // Strip 'parser' out of the data, otherwise it is too verbose\n        if (!DEBUG_DATA_INCLUDE_PARSER) {\n          if (data != undefined) {\n            data = JSON.parse(JSON.stringify(data, (k, v) => (k === 'parser' ? undefined : v)));\n          }\n        }\n\n        console.log(`----- TRACE: ${header} -----`);\n        console.log(JSON.stringify(data, null, 2));\n        console.log(`----- END: ${header} -----`);\n      } else {\n        console.log(`- TRACE: ${header}`);\n      }\n    }\n    /* STRIP:END */\n  }\n}\n\nexport { BitmarkPegParserHelper };\n","/**\n * BitmarkPegParserProcessor.ts\n * RA Sewell\n *\n * (c) 2023 Get More Brain AG\n * All rights reserved.\n *\n * About the parser:\n * -----------------\n *\n * 1. The peggy.js PEG parser is used to parse bitmark markup into a simple AST.\n * 2. The AST can then be walked to generate any output format required.\n *    - The default output format is JSON.\n *    - The output could also be bitmark, therefore providing a way to prettify / standardise bitmark markup.\n * 3. The parser should not generate a fatal error under any circumstances, because all text is valid bitmark markup.\n *    - The only fatal error for a bit is if the bit header tag (e.g. [.cloze:bitmark++]) cannot be parsed. In this\n *      case the bit will be ignored and an error will be added at the AST top level. Parsing will continue.\n *    - If the parser encounters suspect bitmark it will generate 'warnings' which it will attach to the AST bit level\n * 4. The parser should be as fast as possible, without being overly complicated.\n *\n * Theory of operation:\n * --------------------\n *\n * The parser splits the parse into multiple parses. This makes the parser much easier to write and understand than\n * attempting to parse the entire markup in one pass.\n *\n * It also improves the performance in some cases, because although it means multiple passes over the same data, the\n * comparisions made at each pass are fewer and simpler.\n *\n * The parser has the following parse entry points:\n * - bitmark (external code should use this entry point)\n * - bit\n * - cardContent\n *\n * bitmark:\n *\n * This is the top level entry point for parsing a bitmark. It splits a set of bitmark bits into individual bits, and\n * passes each individual bit to the 'bit' entry point for parsing.\n *\n * bit:\n *\n * This is the top level single-bit parser. It parses the bit header, the top level tags, the body, the inline tags,\n * the card set, and the footer. The content of the card set is not parsed.\n *\n * cardContent:\n *\n * This entry point takes in the text content of each card leaf parsed out by the 'bit' parser and parses the\n * inline bits (true/false, sampleSolution, item, lead, etc tags) to produce the card set specific output for the\n * specific bit type being parsed.\n *\n * Each rule of the parser outputs one or more objects containing a 'type', 'value' and optional 'key' property.\n * The 'type' describes to this helper code what the parsed 'value' represents. If the value is not a single value,\n * but a key/value pair then 'key' will also be set.\n *\n *\n * Debugging and Development\n * -------------------------\n *\n * - To build the parser, run 'yarn build-grammar-bit'\n * - Modify the bitmark in '_simple.bitmark' to test the parser (this will be parsed after building the parser)\n * - To undersand the operation and to help debug and develop, use the DEBUG_XXX flags in the code below.\n *   and in BitmarkPegParserHelper.ts\n */\n\nimport { Enum } from '@ncoderz/superenum';\n\nimport { Builder } from '../../../ast/Builder.ts';\nimport { Breakscape } from '../../../breakscaping/Breakscape.ts';\nimport { Config } from '../../../config/Config.ts';\nimport { type BreakscapedString } from '../../../model/ast/BreakscapedString.ts';\nimport { type Bit, type BitmarkAst, type BodyPart } from '../../../model/ast/Nodes.ts';\nimport { type TagsConfig } from '../../../model/config/TagsConfig.ts';\nimport { BitType } from '../../../model/enum/BitType.ts';\nimport { BodyTextFormat } from '../../../model/enum/BodyTextFormat.ts';\nimport { DeprecatedTextFormat } from '../../../model/enum/DeprecatedTextFormat.ts';\nimport { ResourceType } from '../../../model/enum/ResourceType.ts';\nimport { TextFormat } from '../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../model/enum/TextLocation.ts';\nimport { type ParserData } from '../../../model/parser/ParserData.ts';\nimport { type ParserError } from '../../../model/parser/ParserError.ts';\nimport { type ParserInfo } from '../../../model/parser/ParserInfo.ts';\nimport { StringUtils } from '../../../utils/StringUtils.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitHeader,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type ParsedCardSet,\n  type ParseFunction,\n  type ParserHelperOptions,\n  type RawTextAndResourceType,\n  type SubParserResult,\n  TypeKey,\n  type TypeKeyType,\n  type TypeKeyValue,\n  type TypeValue,\n} from './BitmarkPegParserTypes.ts';\nimport { BitmarkPegParserValidator } from './BitmarkPegParserValidator.ts';\nimport { BodyContentProcessor } from './contentProcessors/BodyContentProcessor.ts';\nimport { buildCards } from './contentProcessors/CardContentProcessor.ts';\nimport { defaultTagContentProcessor } from './contentProcessors/DefaultTagContentProcessor.ts';\nimport { FooterContentProcessor } from './contentProcessors/FooterContentProcessor.ts';\nimport { gapChainContentProcessor } from './contentProcessors/GapChainContentProcessor.ts';\nimport { itemLeadChainContentProcessor } from './contentProcessors/ItemLeadChainContentProcessor.ts';\nimport { markChainContentProcessor } from './contentProcessors/MarkChainContentProcessor.ts';\nimport { propertyContentProcessor } from './contentProcessors/PropertyContentProcessor.ts';\nimport { referenceTagContentProcessor } from './contentProcessors/ReferenceTagContentProcessor.ts';\nimport {\n  buildResources,\n  resourceContentProcessor,\n} from './contentProcessors/ResourceContentProcessor.ts';\nimport {\n  buildTitles,\n  titleTagContentProcessor,\n} from './contentProcessors/TitleTagContentProcessor.ts';\nimport { trueFalseChainContentProcessor } from './contentProcessors/TrueFalseChainContentProcessor.ts';\n\n// Debugging flags for helping develop and debug the parser\nconst ENABLE_DEBUG = true;\nconst DEBUG_DATA = true; // Include data in the debug output\nconst DEBUG_DATA_INCLUDE_PARSER = false; // Include the parser data in the debug output - very very verbose!\nconst DEBUG_BIT_RAW = true; // Print the raw bitmark\nconst DEBUG_BIT_CONTENT_RAW = false; // Print the top level parsed bit content (without chars merged to strings - will create a lot of output)\nconst DEBUG_BIT_CONTENT = true; // Print the top level parsed bit content (with BodyChar / CardChar merged)\nconst DEBUG_BIT_TAGS = true; // Print the tags extracted from the bit parsed content\nconst DEBUG_BODY = true; // Print the final parsed body\nconst DEBUG_FOOTER = true; // Print the final parsed footer\nconst DEBUG_CHAIN_CONTENT = true; // Print the parsed chain content\nconst DEBUG_CHAIN_TAGS = true; // Print the tags extracted from the parsed chain content\nconst DEBUG_CARD_SET_CONTENT = true; // Print the parsed card set content\nconst DEBUG_CARD_SET = true; // Print the card set built from the parsed card set content\nconst DEBUG_CARD_TAGS = true; // Print the tags extracted from the card content\n\n// DO NOT EDIT THIS LINE. Ensures no debug in production in case ENABLE_DEBUG is accidentally left on\nconst DEBUG = ENABLE_DEBUG && process.env.BPG_ENV === 'development';\n\nconst builder = new Builder();\n\nclass BitmarkPegParserProcessor {\n  private context: BitmarkPegParserContext;\n  private nonFatalWarnings: ParserError[] = [];\n  private nonFatalErrors: ParserError[] = [];\n  private parser: ParserInfo = {};\n\n  private parse: ParseFunction;\n  private parserText: () => ParserError['text'];\n  private parserLocation: () => ParserError['location'];\n\n  constructor(options: ParserHelperOptions) {\n    this.parse = options.parse;\n    this.parserText = options.parserText;\n    this.parserLocation = options.parserLocation;\n\n    // The context is used to pass the parser data and functions to the content builders\n    this.context = {\n      bitConfig: Config.getBitConfig(BitType._error),\n      bitType: BitType._error,\n      textFormat: TextFormat.bitmarkText,\n\n      DEBUG_BIT_RAW,\n      DEBUG_BIT_CONTENT_RAW,\n      DEBUG_BIT_CONTENT,\n      DEBUG_BIT_TAGS,\n      DEBUG_BODY,\n      DEBUG_FOOTER,\n      DEBUG_CHAIN_CONTENT,\n      DEBUG_CHAIN_TAGS,\n      DEBUG_CARD_SET_CONTENT,\n      DEBUG_CARD_SET,\n      DEBUG_CARD_TAGS,\n\n      parser: this.parser,\n\n      parse: this.parse,\n      bitContentProcessor: this.bitContentProcessor.bind(this),\n      splitBitContent: this.splitBitContent.bind(this),\n      addWarning: this.addWarning.bind(this),\n      addError: this.addError.bind(this),\n      debugPrint: this.debugPrint.bind(this),\n\n      state: {\n        //\n      },\n    };\n  }\n\n  // Build bits\n  buildBits(rawBits: SubParserResult<Bit>[]): BitmarkAst {\n    const bits: Bit[] = [];\n    let errors: ParserError[] = [];\n\n    for (const rawBit of rawBits) {\n      // Ignore empty bits (only happens if entire file is empty / whitespace only\n      if (!rawBit) continue;\n\n      const bit = rawBit.value;\n      if (bit) {\n        // Add the bit to the list of bits\n        bits.push(bit);\n      } else {\n        // TODO - convert error location to master parser location\n\n        // If bit is undefined, then there was an error parsing the bit\n        errors = errors.concat(rawBit.errors ?? []);\n      }\n    }\n\n    const res = builder.buildBitmark({\n      bits,\n      errors: errors.length > 0 ? errors : undefined,\n    });\n\n    return res;\n  }\n\n  // Build bit\n  buildBit(bitHeader: BitHeader, bitContent: BitContent[]): SubParserResult<Bit> {\n    const { bitType, textFormat, resourceType, bitLevel, isCommented } = bitHeader;\n\n    // Bit type was invalid, so ignore the bit, returning instead the parsing errors\n    if (!bitType || Config.isOfBitType(bitType, BitType._error)) return this.invalidBit();\n\n    const bitConfig = Config.getBitConfig(bitType);\n\n    // Set the bit type, text format, etc in the context\n    this.context.bitConfig = bitConfig;\n    this.context.bitType = bitType;\n    this.context.textFormat = textFormat;\n    this.context.resourceType = resourceType;\n\n    if (DEBUG_BIT_CONTENT_RAW) this.debugPrint('BIT CONTENT RAW', bitContent);\n\n    const isTrueFalseV1 = Config.isOfBitType(bitType, BitType.trueFalse1);\n    const isMultipleChoiceV1 = Config.isOfBitType(bitType, BitType.multipleChoice1);\n    const isMultipleResponseV1 = Config.isOfBitType(bitType, BitType.multipleResponse1);\n\n    if (DEBUG_BIT_CONTENT) this.debugPrint('BIT CONTENT', bitContent);\n\n    // Rest the parser state\n    this.resetParserState();\n\n    // Squash inline body bits for bits / text formats that do not support inline body bits\n    bitContent = this.squashUnwantedInlineBodyBits(bitContent);\n\n    // Validate the bit tags\n    bitContent = BitmarkPegParserValidator.validateBitTags(this.context, bitContent);\n\n    // Parse the bit content into a an object with the appropriate keys\n\n    const {\n      body,\n      footer,\n      cardSet,\n      title,\n      statement,\n      statements,\n      choices,\n      responses,\n      propertyStyleResources,\n      resources,\n      posterImage,\n      internalComments,\n      ...tags\n    } = this.bitContentProcessor(BitContentLevel.Bit, bitConfig.tags, bitContent);\n\n    if (DEBUG_BIT_TAGS) this.debugPrint('BIT TAGS', tags);\n    if (DEBUG_BODY) this.debugPrint('BIT BODY', body);\n    if (DEBUG_FOOTER) this.debugPrint('BIT FOOTER', footer);\n\n    // Build the titles for the specific bit type\n    const titles = buildTitles(this.context, bitType, title);\n\n    // Build the card data for the specific bit type\n    const bitSpecificCards = buildCards(\n      this.context,\n      bitType,\n      textFormat,\n      cardSet,\n      statement,\n      statements,\n      choices,\n      responses,\n    );\n\n    // Build the resources\n    const filteredResources = buildResources(this.context, resourceType, resources);\n\n    // Build the final internal comments\n    const internalComment = [\n      ...(internalComments ?? []),\n      ...(bitSpecificCards.internalComments ?? []),\n    ];\n\n    // Build the warnings and errors for the parser object\n    const warnings = this.buildBitLevelWarnings();\n    const errors = this.buildBitLevelErrors();\n    if (warnings) this.parser.warnings = warnings;\n    if (errors) this.parser.errors = errors;\n\n    // Build the final bit\n    const bit = builder.buildBit({\n      bitType,\n      bitLevel,\n      isCommented,\n      textFormat,\n      resourceType,\n      ...titles,\n      posterImage: posterImage as string,\n      statement: isTrueFalseV1 ? statement : undefined,\n      choices: isMultipleChoiceV1 ? choices : undefined,\n      responses: isMultipleResponseV1 ? responses : undefined,\n      ...tags,\n      ...propertyStyleResources,\n      resources: filteredResources,\n      ...bitSpecificCards,\n      body,\n      footer,\n      internalComment,\n      parser: this.parser,\n    });\n\n    return { value: bit };\n  }\n\n  // Build bit for data that cannot be parsed\n  invalidBit(bitData?: unknown): SubParserResult<Bit> {\n    // Create the error is bitData is defined (else it was created when parsing the header)\n    if (bitData) this.addError(`Invalid bit`);\n\n    // Build the errors\n    this.parser.errors = this.buildBitLevelErrors();\n\n    // Build the error bit\n    const bit = builder.buildBit({\n      bitType: Config.getBitType(BitType._error),\n      bitLevel: 1,\n      parser: this.parser,\n    });\n\n    return { value: bit };\n  }\n\n  // Build bit header\n  buildBitHeader(\n    bitTypeBreakscaped: BreakscapedString,\n    bitLevel: number,\n    textFormatAndResourceType: RawTextAndResourceType,\n  ): BitHeader {\n    // Unbreakscape the bit type\n    const bitType = Breakscape.unbreakscape(bitTypeBreakscaped, {\n      format: TextFormat.plainText,\n      location: TextLocation.tag,\n    });\n\n    // Get / check bit type\n    const validBitType = Config.getBitType(bitType);\n    const commented = Config.isBitTypeCommented(bitType);\n\n    if (Config.isOfBitType(validBitType, BitType._error)) {\n      this.addError(`Invalid bit type: '${bitType}'`);\n    }\n\n    const bitConfig = Config.getBitConfig(validBitType);\n\n    // Bit level\n    if (bitLevel > Config.bitLevelMax) {\n      this.addWarning(\n        `Bit level of ${bitLevel} too high, setting to max value of ${Config.bitLevelMax}`,\n      );\n      bitLevel = Config.bitLevelMax;\n    } else if (bitLevel < Config.bitLevelMin) {\n      this.addWarning(\n        `Bit level of ${bitLevel} too low, setting to min value of ${Config.bitLevelMin}`,\n      );\n      bitLevel = Config.bitLevelMin;\n    }\n\n    // Text format\n    let textFormat = Enum(TextFormat).fromValue(textFormatAndResourceType.textFormat);\n    const isInvalidTextFormat = textFormatAndResourceType.textFormat && !textFormat;\n    if (isInvalidTextFormat) {\n      this.addWarning(\n        `Invalid text format '${textFormatAndResourceType.textFormat}', defaulting to '${BodyTextFormat.bitmarkPlusPlus}'`,\n      );\n    }\n\n    // Deprecated warning for bitmark--\n    const deprecatedTextFormat = Enum(DeprecatedTextFormat).fromValue(\n      textFormatAndResourceType.textFormat,\n    );\n    if (deprecatedTextFormat) {\n      textFormat = TextFormat.bitmarkText;\n      this.addWarning(\n        `${deprecatedTextFormat} text format is deprecated. Bit will be parsed as '${BodyTextFormat.bitmarkPlusPlus}'`,\n      );\n    }\n\n    textFormat = textFormat ?? bitConfig.textFormatDefault;\n\n    // Resource type\n    const resourceType = Enum(ResourceType).fromValue(textFormatAndResourceType.resourceType);\n    if (textFormatAndResourceType.resourceType && !resourceType) {\n      this.addWarning(\n        `Invalid resource type '${textFormatAndResourceType.resourceType}', it will be ignored`,\n      );\n    }\n\n    return {\n      bitType: validBitType,\n      bitLevel,\n      textFormat: textFormat ?? bitConfig.textFormatDefault,\n      resourceType,\n      isCommented: commented,\n    };\n  }\n\n  // Build text and resource type\n  buildTextAndResourceType(\n    value1: TypeValue | undefined,\n    value2: TypeValue | undefined,\n  ): RawTextAndResourceType {\n    const res: RawTextAndResourceType = {};\n\n    const processValue = (value: TypeValue | undefined) => {\n      if (value) {\n        const val = Breakscape.unbreakscape(StringUtils.string(value.value) as BreakscapedString, {\n          format: TextFormat.plainText,\n          location: TextLocation.tag,\n        });\n        if (value.type === TypeKey.TextFormat) {\n          // Set text format\n          res.textFormat = val;\n        } else {\n          // Set resource type\n          res.resourceType = val;\n        }\n      }\n    };\n    processValue(value1);\n    processValue(value2);\n\n    return res;\n  }\n\n  /**\n   * Reset the parser state\n   *\n   */\n  private resetParserState() {\n    this.context.state = {};\n  }\n\n  /**\n   * Process Type/Key/Value data, squashing inline body bits back into text for bits / body text formats that\n   * do not support them, and for after the plain text tag '$$$$'.\n   *\n   * @param data the bit content (Type/Key/Value data)\n   * @returns\n   */\n  private squashUnwantedInlineBodyBits(data: BitContent[]): BitContent[] {\n    const result: BitContent[] = [];\n    if (!data) return result;\n\n    const { textFormat } = this.context;\n\n    const isBitmarkText = textFormat === TextFormat.bitmarkText;\n\n    // Format: text / latex\n    // Body bits are only supported up to the first BodyText tag.\n    // Squash the subsequent body bits back into text.\n\n    const convertTagToTextRecursive = (tag: BitContent, str = ''): string => {\n      const { chain, parser } = tag as TypeKeyValue;\n      str += parser.text;\n      if (chain) {\n        for (const t of chain) {\n          str = convertTagToTextRecursive(t, str);\n        }\n      }\n      return str;\n    };\n\n    // New code: Only tags before the $$$$ tag (or first text if not bitmark--/++) are interpreted as tags\n    // all other tags are squashed back to text\n    let inPlainText = false;\n    for (const content of data) {\n      const { type, value } = content as TypeKeyValue;\n      const valueStr = (value ?? '') as string;\n      let atPlainTextDivider = false;\n\n      if (!inPlainText) {\n        if (type === TypeKey.BodyText && !isBitmarkText && valueStr && valueStr.trim()) {\n          inPlainText = true;\n        }\n        if (type === TypeKey.PlainTextDivider) {\n          inPlainText = true;\n          atPlainTextDivider = true;\n        }\n      }\n\n      if (!atPlainTextDivider) {\n        if (inPlainText) {\n          if (type === TypeKey.BodyText) {\n            result.push({ type: TypeKey.BodyTextPlain, value } as TypeValue);\n          } else {\n            const s = convertTagToTextRecursive(content);\n            result.push({ type: TypeKey.BodyTextPlain, value: s } as TypeValue);\n          }\n        } else {\n          result.push(content);\n        }\n      } else {\n        result.push({ type: TypeKey.BodyText, value: '\\n' } as TypeValue);\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * Process Type/Key/Value data, building the bit parts as AST nodes.\n   *\n   * @param bitType bit type\n   * @param textFormat bit text format type\n   * @param contentDepth bit level (in chain, in card etc)\n   * @param tagsConfig tags configuration at this parser level (pass undef)\n   * @param data the bit content (Type/Key/Value data)\n   * @returns\n   */\n  private bitContentProcessor(\n    contentDepth: ContentDepthType,\n    tagsConfig: TagsConfig | undefined,\n    data: BitContent[] | undefined,\n  ): BitContentProcessorResult {\n    const result: BitContentProcessorResult = {};\n    if (!data) return result;\n\n    const { bitType, textFormat } = this.context;\n\n    result.title = [];\n    result.solutions = [];\n    result.__solutionsAst = [];\n    result.statements = [];\n    result.choices = [];\n    result.responses = [];\n    result.propertyStyleResources = {};\n    result.resources = [];\n    result.trueFalse = [];\n    result.markConfig = [];\n    result.extraProperties = {};\n    result.internalComments = [];\n\n    let inFooter = false;\n    const bodyParts: BodyPart[] = [];\n    let bodyTextPart: BreakscapedString = Breakscape.EMPTY_STRING;\n    let footer: BreakscapedString = Breakscape.EMPTY_STRING;\n    let bodyPlainText: BreakscapedString = Breakscape.EMPTY_STRING;\n    let footerPlainText: BreakscapedString = Breakscape.EMPTY_STRING;\n    // let cardBody: BreakscapedString = Breakscape.EMPTY_STRING;\n\n    const inBit = contentDepth === BitContentLevel.Bit;\n    const inCard = contentDepth === BitContentLevel.Card;\n    const inChain = contentDepth === BitContentLevel.Chain;\n\n    // Helper for building the body text\n    const addBodyText = () => {\n      if (bodyTextPart) {\n        // Validate the body part\n        bodyTextPart = BitmarkPegParserValidator.checkBodyPart(\n          this.context,\n          contentDepth,\n          bodyTextPart,\n        );\n\n        const bodyText = BodyContentProcessor.buildBodyText(bodyTextPart, false);\n        bodyParts.push(bodyText);\n      }\n      bodyTextPart = Breakscape.EMPTY_STRING;\n    };\n\n    // Reduce the Type/Key/Value data to a single object that can be used to build the bit\n    // let _index = 0;\n    for (const content of data) {\n      const { type, value } = content as TypeKeyValue;\n\n      switch (type) {\n        case TypeKey.ItemLead: {\n          itemLeadChainContentProcessor(this.context, contentDepth, tagsConfig, content, result);\n          break;\n        }\n\n        case TypeKey.Instruction:\n        case TypeKey.Hint:\n        case TypeKey.Anchor:\n        case TypeKey.SampleSolution:\n          defaultTagContentProcessor(this.context, contentDepth, tagsConfig, content, result);\n          break;\n\n        case TypeKey.Reference:\n          referenceTagContentProcessor(this.context, contentDepth, tagsConfig, content, result);\n          break;\n\n        case TypeKey.Title:\n          titleTagContentProcessor(this.context, contentDepth, tagsConfig, content, result);\n          break;\n\n        case TypeKey.Property:\n          propertyContentProcessor(this.context, contentDepth, tagsConfig, content, result);\n          break;\n\n        case TypeKey.Gap: {\n          if (!inChain) addBodyText(); // Body bit, so add the body text\n          gapChainContentProcessor(\n            this.context,\n            contentDepth,\n            tagsConfig,\n            content,\n            result,\n            bodyParts,\n          );\n          break;\n        }\n\n        case TypeKey.Mark: {\n          if (!inChain) addBodyText(); // Body bit, so add the body text\n          markChainContentProcessor(\n            this.context,\n            contentDepth,\n            tagsConfig,\n            content,\n            result,\n            bodyParts,\n          );\n          break;\n        }\n\n        case TypeKey.True:\n        case TypeKey.False: {\n          if (!inChain) addBodyText(); // Body bit, so add the body text\n          trueFalseChainContentProcessor(\n            this.context,\n            contentDepth,\n            tagsConfig,\n            content,\n            result,\n            bodyParts,\n          );\n          break;\n        }\n\n        case TypeKey.Resource:\n          resourceContentProcessor(this.context, contentDepth, tagsConfig, content, result);\n          break;\n\n        case TypeKey.CardSet: {\n          result.cardSet = value as ParsedCardSet;\n          inFooter = true; // After the card set, body lines should be written to the footer rather than the body\n          break;\n        }\n\n        case TypeKey.BodyText:\n        case TypeKey.CardText: {\n          if (inFooter) {\n            footer = Breakscape.concatenate(footer, value as BreakscapedString);\n          } else {\n            bodyTextPart = Breakscape.concatenate(bodyTextPart, value as BreakscapedString);\n          }\n          break;\n        }\n\n        case TypeKey.BodyTextPlain: {\n          if (inFooter) {\n            footerPlainText = Breakscape.concatenate(footerPlainText, value as BreakscapedString);\n          } else {\n            bodyPlainText = Breakscape.concatenate(bodyPlainText, value as BreakscapedString);\n          }\n          break;\n        }\n\n        case TypeKey.FooterDivider: {\n          if (inFooter) {\n            // If already in footer, handle the content as if it is footer (body) text\n            footer = Breakscape.concatenate(footer, value as BreakscapedString);\n          }\n          inFooter = true; // After the footer divider, body lines should be written to the footer rather than the body\n          break;\n        }\n\n        default:\n        // Unknown tag\n      }\n\n      // _index++;\n    }\n\n    // Add the last body text part, and trim the body text parts\n    addBodyText();\n\n    // Add the plain texts if they exist\n    const bodyPlainTextNode = bodyPlainText\n      ? BodyContentProcessor.buildBodyText(bodyPlainText, true)\n      : undefined;\n    if (bodyPlainTextNode) bodyParts.push(bodyPlainTextNode);\n\n    // Spread the chained item / lead / etc\n    // Set the lead item from the chain\n    if (result.itemLead) {\n      const l = result.itemLead.length;\n      if (l > 0) result.item = result.itemLead[0];\n      if (l > 1) result.lead = result.itemLead[1];\n      if (l > 2) result.pageNumber = result.itemLead[2];\n      if (l > 3) result.marginNumber = result.itemLead[l - 1];\n    }\n    if (result.__itemLeadString) {\n      const l = result.__itemLeadString.length;\n      if (l > 0) result.__itemString = result.__itemLeadString[0];\n      if (l > 1) result.__leadString = result.__itemLeadString[1];\n      if (l > 2) result.__pageNumberString = result.__itemLeadString[2];\n      if (l > 3) result.__marginNumberString = result.__itemLeadString[l - 1];\n    }\n\n    // Validate and build the body (trimmed)\n    if (inBit) {\n      result.body = BodyContentProcessor.process(\n        this.context,\n        contentDepth,\n        bitType,\n        textFormat,\n        tagsConfig,\n        result,\n        bodyParts,\n        false,\n      );\n      //  bodyParts.length > 0 ? builder.body({ bodyParts: this.trimBodyParts(bodyParts) }) : undefined;\n      // result.body = BitmarkPegParserValidator.checkBody(this.context, contentDepth, bitType, textFormat, result.body);\n    } else if (inCard) {\n      result.cardBody = BodyContentProcessor.process(\n        this.context,\n        contentDepth,\n        bitType,\n        textFormat,\n        tagsConfig,\n        result,\n        bodyParts,\n        true,\n      );\n      // result.cardBody = bodyParts.length > 0 ? builder.body({ bodyParts: this.trimBodyParts(bodyParts) }) : undefined;\n      // Card body is validated in CardContentProcessor:processCardSet()\n    }\n\n    // Validate and build the footer (trimmed)\n    // footer = footer.trim() as BreakscapedString;\n    // footerPlainText = footerPlainText.trim() as BreakscapedString;\n    // if (footer || footerPlainText) {\n    //   if (footer) {\n    //     footer = BitmarkPegParserValidator.checkFooter(this.context, contentDepth, bitType, footer);\n    //   }\n    //   const footerTexts: FooterText[] = [];\n    //   const footerNode = footer ? builder.footerText({ text: footer }, false) : undefined;\n    //   const footerPlainTextNode = footerPlainText ? builder.footerText({ text: footerPlainText }, true) : undefined;\n    //   if (footerNode) footerTexts.push(footerNode);\n    //   if (footerPlainTextNode) footerTexts.push(footerPlainTextNode);\n    //   if (footer) {\n    //     result.footer =\n    //       footerTexts.length > 0 ? builder.footer({ footerParts: this.trimFooterTexts(footerTexts) }) : undefined;\n    //   }\n    // }\n    result.footer = FooterContentProcessor.process(\n      this.context,\n      contentDepth,\n      tagsConfig,\n      result,\n      footer,\n      footerPlainText,\n    );\n\n    // // Add card body (validated elsewhere)\n    // cardBody = cardBody.trim() as BreakscapedString;\n    // if (cardBody) {\n    //   result.cardBody = cardBody;\n    // }\n\n    // Remove the extra properties if there are none\n    if (Object.keys(result.extraProperties).length === 0) delete result.extraProperties;\n\n    // Remove the unwanted empty arrays.\n    if (result.title.length === 0) delete result.title;\n    if (result.solutions.length === 0) delete result.solutions;\n    if (result.statements.length === 0) delete result.statements;\n    if (result.choices.length === 0) delete result.choices;\n    if (result.responses.length === 0) delete result.responses;\n    if (result.trueFalse.length === 0) delete result.trueFalse;\n    if (result.markConfig.length === 0) delete result.markConfig;\n    if (Object.keys(result.propertyStyleResources).length === 0)\n      delete result.propertyStyleResources;\n    if (result.resources.length === 0) delete result.resources;\n    if (result.internalComments.length === 0) delete result.internalComments;\n\n    return result;\n  }\n\n  private buildBitLevelWarnings(): ParserError[] | undefined {\n    let warnings: ParserError[] | undefined;\n    if (this.nonFatalWarnings.length > 0) {\n      warnings = this.nonFatalWarnings;\n      this.nonFatalWarnings = [];\n    }\n    return warnings;\n  }\n\n  private buildBitLevelErrors(): ParserError[] | undefined {\n    let errors: ParserError[] | undefined;\n    if (this.nonFatalErrors.length > 0) {\n      errors = this.nonFatalErrors;\n      this.nonFatalErrors = [];\n    }\n    return errors;\n  }\n\n  /**\n   * Split bit content into parts based on the given type keys\n   *\n   * @param bitContent bit content to split\n   * @param types to split on\n   */\n  private splitBitContent(bitContent: BitContent[], types: TypeKeyType[]): BitContent[][] {\n    const parts: BitContent[][] = [];\n    let part: BitContent[] = [];\n\n    for (const c of bitContent) {\n      if (types.includes(c.type as TypeKeyType)) {\n        if (part.length > 0) parts.push(part);\n        part = [];\n      }\n      part.push(c);\n    }\n\n    if (part.length > 0) parts.push(part);\n\n    return parts;\n  }\n\n  //\n  // Util functions\n  //\n\n  /**\n   * Add an warning to the list of non-fatal warnings\n   * @param message The error message\n   * @param parserData Parser data - if not set, the current parser data will be used\n   * @param parserDataOriginal Parser data of the original instance of a duplicate error\n   */\n  private addWarning(message: string, parserData?: ParserData, parserDataOriginal?: ParserData) {\n    const warning: ParserError = {\n      message,\n      text: parserData?.parser.text ?? this.parserText(),\n      location: parserData?.parser.location ?? this.parserLocation(),\n      original: parserDataOriginal?.parser ?? undefined,\n    };\n    if (!warning.original) delete warning.original;\n\n    this.nonFatalWarnings.push(warning);\n  }\n\n  /**\n   * Add an error to the list of non-fatal errors\n   * @param message The error message\n   * @param parserData Parser data - if not set, the current parser data will be used\n   * @param parserDataOriginal Parser data of the original instance of a duplicate error\n   */\n  private addError(message: string, parserData?: ParserData, parserDataOriginal?: ParserData) {\n    const error: ParserError = {\n      message,\n      text: parserData?.parser.text ?? this.parserText(),\n      location: parserData?.parser.location ?? this.parserLocation(),\n      original: parserDataOriginal?.parser ?? undefined,\n    };\n    if (!error.original) delete error.original;\n\n    this.nonFatalErrors.push(error);\n  }\n\n  /**\n   * Print out data for debugging\n   *\n   * @param header\n   * @param data\n   */\n  private debugPrint(header: string, data: unknown): void {\n    /* STRIP:START */\n    if (DEBUG) {\n      if (DEBUG_DATA) {\n        // Strip 'parser' out of the data, otherwise it is too verbose\n        if (!DEBUG_DATA_INCLUDE_PARSER) {\n          if (data != undefined) {\n            data = JSON.parse(JSON.stringify(data, (k, v) => (k === 'parser' ? undefined : v)));\n          }\n        }\n\n        console.log(`===== START: ${header} =====`);\n        console.log(JSON.stringify(data, null, 2));\n        console.log(`===== END: ${header} =====`);\n      } else {\n        console.log(`- DEBUG: ${header}`);\n      }\n    }\n    /* STRIP:END */\n  }\n}\n\nexport { BitmarkPegParserProcessor };\n","/**\n * BitmarkPegParserValidator.ts\n * RA Sewell\n *\n * (c) 2023 Get More Brain AG\n * All rights reserved.\n *\n */\n\nimport { Enum } from '@ncoderz/superenum';\n\nimport { Config } from '../../../config/Config.ts';\nimport { type BreakscapedString } from '../../../model/ast/BreakscapedString.ts';\nimport { type Body, type BodyPart } from '../../../model/ast/Nodes.ts';\nimport { type JsonText } from '../../../model/ast/TextNodes.ts';\nimport { CardSetConfig } from '../../../model/config/CardSetConfig.ts';\nimport { ConfigKey, type ConfigKeyType } from '../../../model/config/enum/ConfigKey.ts';\nimport { type TagsConfig } from '../../../model/config/TagsConfig.ts';\nimport {\n  BitTagConfigKeyType,\n  type BitTagConfigKeyTypeType,\n} from '../../../model/enum/BitTagConfigKeyType.ts';\nimport { type BitTypeType } from '../../../model/enum/BitType.ts';\nimport { Count, type CountType } from '../../../model/enum/Count.ts';\nimport { type TagType } from '../../../model/enum/Tag.ts';\nimport { type TextFormatType } from '../../../model/enum/TextFormat.ts';\nimport { type ParserData } from '../../../model/parser/ParserData.ts';\nimport { type TagValidationData } from '../../../model/parser/TagValidationData.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type ParsedCardSet,\n  TypeKey,\n  type TypeKeyType,\n  type TypeKeyValue,\n} from './BitmarkPegParserTypes.ts';\n\nconst COMMON_MISTAKE_STRINGS = [\n  // Card divider errors\n  '----',\n  '\\n==\\n',\n  '\\n---\\n',\n  // Remark errors\n  // Comment errors\n];\n\nconst COMMON_STARTS_WITH_MISTAKE_STRINGS = [\n  // Card divider errors\n  '==\\n',\n  '--\\n',\n];\n\nconst COMMON_ENDS_WITH_MISTAKE_STRINGS = [\n  // Card divider errors\n  '\\n==',\n  '\\n--',\n];\n\ninterface WarningInfo {\n  invalid?: boolean; // Tag / data is not valid for this bit\n  tooMany?: number; // The tag / data has been included too many times (should be at most this many times)\n  tooFew?: number; // The tag / data has not been included enough times (should be at least this many times)\n  extraProperty?: boolean; // The property is not recognised, but will be included as an extra property\n  excessResource?: boolean; // The resource is not allowed, but will be included as an excess resource\n  unexpectedCardSet?: boolean; // The card set was not expected for this bit\n  unexpectedCardSideVariant?: boolean; // The card side variant is not recognised for the card set\n  warning?: string;\n  content?: BitContent;\n  previousContent?: ParserData | undefined;\n}\n\ninterface ValidateReturn {\n  content?: BitContent | undefined;\n  warning?: WarningInfo;\n}\n\ninterface ValidateSingleTagReturn {\n  validated: BitContent | undefined;\n  warning?: WarningInfo;\n}\n\ninterface ValidateChainRecursiveReturn {\n  validated: BitContent[];\n  remaining?: BitContent; // Tag split off from the chain\n}\n\nclass BitmarkPegParserValidator {\n  /**\n   * Validate the bit tags and tag chains.\n   *\n   * Any unknown tag chains will be 'unchained' and processed as individual tags.\n   *\n   * @param context\n   * @param bitType\n   * @param resourceType the resource type specified in the bit header\n   * @param data the unvalidated bit content from the parser\n   *\n   * @returns the validated and potentially unchained bit content\n   */\n  validateBitTags(context: BitmarkPegParserContext, data: BitContent[]): BitContent[] {\n    // if (context.DEBUG_BIT_TAG_VALIDATION) context.debugPrint('bit tag validation', data);\n    if (!data) return [];\n\n    const { bitConfig, bitType, resourceType } = context;\n\n    // Get the bit config to check how to parse the bit\n\n    const { tags: bitTags, cardSet: cardSetConfig } = bitConfig;\n\n    // Insert the resource tags from the resources config (which can depends on the resource type attachment in the bit header).\n    const resourcesConfig = Config.getBitResourcesConfig(bitType, resourceType);\n    const tags = { ...bitTags, ...resourcesConfig.tags };\n\n    // Validate and convert the tag chains\n    const res: BitContent[] = this.validateTagChainsRecursive(\n      context,\n      BitContentLevel.Bit,\n      bitType,\n      data,\n      tags,\n      cardSetConfig,\n    ).validated;\n\n    // TODO: Check the minimum counts\n    // const minCount = tagData.minCount == null ? 0 : tagData.minCount;\n\n    return res;\n  }\n\n  /**\n   * Check the body of the bit.\n   *\n   * This function also converts the body to JSON if the text format is JSON.\n   *\n   * @param context\n   * @param bitType\n   * @param _contentDepth\n   * @param body\n   * @returns\n   */\n  checkBody(\n    context: BitmarkPegParserContext,\n    _contentDepth: ContentDepthType,\n    bitType: BitTypeType,\n    _textFormat: TextFormatType,\n    bodyParts: BodyPart[] | undefined,\n  ): BodyPart[] | undefined {\n    if (!bodyParts) return bodyParts;\n\n    const { bitConfig } = context;\n\n    // Get the bit config to check how to parse the bit\n\n    const { bodyAllowed } = bitConfig;\n\n    const hasBody = bodyParts.length > 0;\n\n    if (hasBody && !bodyAllowed) {\n      context.addWarning(`Bit '${bitType}' should not have a body.`);\n    }\n\n    return bodyParts;\n  }\n\n  /**\n   * Check the body part of the bit.\n   *\n   * @param context\n   * @param _contentDepth\n   * @param bitType\n   * @param body\n   * @returns\n   */\n  checkBodyPart(\n    context: BitmarkPegParserContext,\n    contentDepth: ContentDepthType,\n    bodyPart: BreakscapedString,\n  ): BreakscapedString {\n    if (!bodyPart) return bodyPart;\n\n    this.checkBodyForCommonPotentialMistakes(context, contentDepth, bodyPart);\n\n    return bodyPart;\n  }\n\n  /**\n   * Check the footer of the bit.\n   *\n   * @param context\n   * @param _contentDepth\n   * @param bitType\n   * @param body\n   * @returns\n   */\n  checkFooter(\n    context: BitmarkPegParserContext,\n    contentDepth: ContentDepthType,\n    footer: BreakscapedString,\n  ): BreakscapedString {\n    if (!footer) return footer;\n\n    const { bitConfig, bitType } = context;\n\n    // Get the bit config to check how to parse the bit\n    const { footerAllowed } = bitConfig;\n\n    this.checkBodyForCommonPotentialMistakes(context, contentDepth, footer);\n\n    if (!footerAllowed) {\n      context.addWarning(`Bit '${bitType}' should not have a footer.`);\n    }\n\n    return footer;\n  }\n\n  /**\n   * Check the footer of the bit.\n   *\n   * @param context\n   * @param _contentDepth\n   * @param bitType\n   * @param cardBody\n   * @returns\n   */\n  checkCardBody(\n    context: BitmarkPegParserContext,\n    _contentDepth: ContentDepthType,\n    bitType: BitTypeType,\n    cardBody: Body | undefined,\n    cardNo: number,\n    sideNo: number,\n    variantNo: number,\n  ): Body | undefined {\n    if (!cardBody || !cardBody.body) return cardBody;\n\n    const { bitConfig } = context;\n\n    // Get the bit config to check how to parse the bit\n    if (!bitConfig.cardSet) return cardBody; // Won't happen. Just to make TS happy\n\n    const variantConfig = Config.getCardSetVariantConfig(bitType, sideNo, variantNo);\n    if (!variantConfig) return cardBody; // Won't happen. Just to make TS happy\n\n    const { bodyAllowed } = variantConfig;\n\n    const hasBody = (cardBody.bodyString as JsonText).length > 0;\n\n    // this.checkBodyForCommonPotentialMistakes(context, contentDepth, bitType, cardBody);\n\n    if (hasBody && !bodyAllowed) {\n      context.addWarning(\n        `Bit '${bitType}' should not have a card body at card:${cardNo + 1}, side:${sideNo + 1}, variant:${\n          variantNo + 1\n        }.`,\n      );\n    }\n\n    return cardBody;\n  }\n\n  //\n  // Private\n  //\n\n  /**\n   * Validate tag chains as they are encountered, expanding any tag chains that are not valid,\n   * so they can be processed as individual tags.\n   *\n   * @param context\n   * @param contentDepth\n   * @param bitType\n   * @param data\n   * @param tags\n   * @param cardSetConfig\n   */\n  private validateTagChainsRecursive(\n    context: BitmarkPegParserContext,\n    contentDepth: ContentDepthType,\n    bitType: BitTypeType,\n    data: BitContent[],\n    tags: TagsConfig,\n    cardSetConfig?: CardSetConfig,\n    chainHeadType?: TypeKeyType,\n  ): ValidateChainRecursiveReturn {\n    if (!data) {\n      return {\n        validated: [],\n      };\n    }\n\n    let remaining: BitContent | undefined;\n    const dataOrNull: (BitContent | null)[] = [...data];\n\n    // Get valid type keys from the tags\n    const validTypeKeys = this.convertTagsToTypeKeyMap(context, contentDepth, bitType, tags);\n\n    // Helper function for add extra valid type keys\n    const addExtraValidTypeKeys = (key: TypeKeyType, maxCount: CountType, minCount: number) => {\n      validTypeKeys.set(key, {\n        maxCount,\n        minCount,\n        _type: key as BitTagConfigKeyTypeType,\n        _tag: key as TagType,\n        _seenCount: 0,\n      });\n    };\n\n    if (contentDepth === BitContentLevel.Bit) {\n      // Add the extra valid tags dependent on bit configuration\n      if (cardSetConfig) addExtraValidTypeKeys(TypeKey.CardSet, 1, 0);\n\n      // These tags are always allowed here, and validated later\n      addExtraValidTypeKeys(TypeKey.TextFormat, 1, 0);\n      addExtraValidTypeKeys(TypeKey.BodyText, Count.infinity, 0);\n      addExtraValidTypeKeys(TypeKey.BodyTextPlain, Count.infinity, 0);\n      addExtraValidTypeKeys(TypeKey.PlainTextDivider, Count.infinity, 0);\n      addExtraValidTypeKeys(TypeKey.FooterDivider, Count.infinity, 0); // No warning for multiple footers, just ignore\n    } else if (contentDepth === BitContentLevel.Card) {\n      // These tags are always allowed here, and validated later\n      addExtraValidTypeKeys(TypeKey.CardText, Count.infinity, 0);\n    }\n\n    // const end = data.length;\n    for (let i = 0; i < dataOrNull.length; i++) {\n      const content = dataOrNull[i];\n      if (!content) continue;\n\n      const { type, key } = content as TypeKeyValue;\n      let typeKey = Enum(TypeKey).fromValue(type);\n      if (!typeKey) continue; // Should not happen\n\n      // Build the final valid type key which is the key for property / resources\n      let validTypeKey: TypeKeyType | string | undefined = typeKey;\n      if (typeKey === TypeKey.Property || typeKey === TypeKey.Resource) {\n        validTypeKey = key;\n      }\n\n      // Get the tag data for this tag type and key. If not found, the tag is not valid\n      let tagData = validTypeKeys.get(validTypeKey);\n\n      // Support [@ fallback to [&:\n      // See: https://github.com/getMoreBrain/cosmic/issues/7859\n      // In the case of a property tag that is not found, convert it to a resource tag and retry\n      // Only for specific tags. This is to support legacy tags for a short period and will be removed in the future\n      // (support @ instead of & for resources)\n      if (!tagData && typeKey === TypeKey.Property) {\n        const resourceKey = key.replace(/^@/, '&') as ConfigKeyType;\n        if (\n          resourceKey === ConfigKey.resource_backgroundWallpaper ||\n          resourceKey === ConfigKey.resource_imagePlaceholder ||\n          resourceKey === ConfigKey.resource_platformIcon ||\n          resourceKey === ConfigKey.resource_platformLogo ||\n          resourceKey === ConfigKey.resource_platformBackgroundImage ||\n          resourceKey === ConfigKey.resource_coverImage\n        ) {\n          tagData = validTypeKeys.get(resourceKey);\n          if (tagData) {\n            typeKey = TypeKey.Resource;\n            content.type = TypeKey.Resource;\n\n            const warningMsg = `Falling back to '[${resourceKey}]' from '[${key}]'. Replace '[${key}]' with '[&${key}]' to avoid this warning.`;\n            context.addWarning(warningMsg);\n          }\n        }\n      }\n\n      // Validate the single tag\n      const { validated: validatedTagContent, warning } = this.validateSingleTag(\n        context,\n        contentDepth,\n        bitType,\n        content,\n        typeKey,\n        tagData,\n        cardSetConfig,\n      );\n\n      // HACK to handle 'chain-within-chain' for [@person] tags (at least to stop the parser splitting the chain)\n      if (typeKey === TypeKey.Resource) chainHeadType = TypeKey.Resource;\n\n      // Tag is not valid in this position. Either remove it or reprocess by breaking the current chain\n      let addWarning = true;\n      if (!validatedTagContent) {\n        if (contentDepth === BitContentLevel.Chain && chainHeadType !== TypeKey.Resource) {\n          // If in a chain and the tag is invalid within the chain then break the chain and re-process the tag as a\n          // single tag with the rest of the chain as a chain [excluding resource chains].\n          remaining = content;\n          const restOfChain = dataOrNull.slice(i + 1);\n          if (restOfChain.length > 0) {\n            remaining.chain = restOfChain as BitContent[];\n          }\n\n          // Remove the data from the current chain\n          dataOrNull.splice(i);\n\n          // Ignore the generated warning from validateSingleTag as the tag will be reprocessed and will then\n          // be valid or will generated a warning there\n          addWarning = false;\n        } else {\n          // The tag is not valid, and either this is not a chain or not a resource chain.\n\n          // Remove the tag from the data\n          dataOrNull.splice(i, 1, null);\n        }\n      }\n\n      // Add the warning generated by validateSingleTag\n      if (warning && addWarning) {\n        context.addWarning(warning.warning ?? '', warning.content, warning.previousContent);\n      }\n\n      // If the content does not have a chain, but the validation data does have a chain, and there are still more\n      // items in this chain, then the remaining items should be considered a sub-chain and processed as such.\n      // Split the remaining items off from the current chain and process them as a separate chain.\n      if (\n        contentDepth === BitContentLevel.Chain &&\n        tagData &&\n        tagData.chain &&\n        validatedTagContent &&\n        !validatedTagContent.chain\n      ) {\n        const restOfChain = dataOrNull.slice(i + 1);\n        if (restOfChain.length > 0) {\n          validatedTagContent.chain = restOfChain as BitContent[];\n        }\n        dataOrNull.splice(i + 1);\n      }\n\n      // If the content has a chain, but the validation data does not have a chain, then the chain is invalid\n      // The chain is split off from the single tag for further processing.\n      // This allows non-chained tags to be compressed into a chain without breaking the behaviour, and makes the\n      // parser more forgiving.\n      if (\n        validatedTagContent &&\n        Array.isArray(validatedTagContent.chain) &&\n        validatedTagContent.chain.length > 0\n      ) {\n        if (tagData && tagData.chain) {\n          const { validated: validatedTagChainContent, remaining: remainingTagChainContent } =\n            this.validateTagChainsRecursive(\n              context,\n              BitContentLevel.Chain,\n              bitType,\n              validatedTagContent.chain,\n              tagData.chain,\n              undefined,\n              validatedTagContent.type as TypeKeyType,\n            );\n          if (validatedTagChainContent && validatedTagChainContent.length > 0) {\n            validatedTagContent.chain = validatedTagChainContent;\n          } else {\n            // Tag chain is invalid, remove it\n            validatedTagContent.chain = undefined;\n          }\n\n          // If there is remaining tag chain content to process, insert it into the data\n          if (remainingTagChainContent) {\n            dataOrNull.splice(i + 1, 0, remainingTagChainContent);\n          }\n        } else {\n          // Tag does not have a chain in the bit config. Split the chain and process as a separate chain.\n          // This allows for 'bugs' such as [%item][%lead][!instruction] - instruction still works.\n          if (validatedTagContent.type !== TypeKey.Resource) {\n            // Build the 'split-off' bit content\n            const remainingTagChainContent: BitContent = validatedTagContent.chain[0];\n            if (validatedTagContent.chain.length > 1) {\n              remainingTagChainContent.chain = validatedTagContent.chain.slice(1);\n            }\n            dataOrNull.splice(i + 1, 0, remainingTagChainContent);\n            // Clear the original chain\n            validatedTagContent.chain = undefined;\n          }\n        }\n      }\n    }\n\n    // Raise warnings for the minimum counts\n    for (const data of validTypeKeys.values()) {\n      const { minCount, _seenCount } = data;\n      if (minCount != null && _seenCount < minCount) {\n        const warningMsg = `${this.getTagSignature(data)} is required at least ${minCount} time(s)`;\n        context.addWarning(warningMsg);\n      }\n    }\n\n    // Filter all the null's from the validated tags\n    const res = dataOrNull.filter((content) => content != null) as BitContent[];\n\n    return {\n      validated: res,\n      remaining,\n    };\n  }\n\n  /**\n   * Validate a single bit tag\n   *\n   * @param context\n   * @param contentDepth\n   * @param bitType\n   * @param content\n   * @param typeKey\n   * @param tagValidationData\n   * @param cardSetConfig\n   *\n   * @returns validated tag, or undefined if the tag is invalid\n   */\n  private validateSingleTag(\n    context: BitmarkPegParserContext,\n    contentDepth: ContentDepthType,\n    bitType: BitTypeType,\n    content: BitContent,\n    typeKey: TypeKeyType,\n    tagValidationData: TagValidationData | undefined,\n    cardSetConfig: CardSetConfig | undefined,\n  ): ValidateSingleTagReturn {\n    // if (context.DEBUG_BIT_TAG_VALIDATION) context.debugPrint('bit tag validation', data);\n\n    const { type, key } = content as TypeKeyValue;\n\n    const keyStr = tagValidationData\n      ? this.getTagSignature(tagValidationData)\n      : this.getUnknownTagSignature(type, key);\n    const ignoredStr = ' It will be ignored';\n    let warningStr = '';\n    let validatedContent: BitContent | undefined;\n    let warning: WarningInfo | undefined;\n\n    // // Get seen data from the seen cache\n    // let seen = seenTypeKeys.get(typeKeyPlusKey);\n    // if (seen == undefined) {\n    //   seen = {\n    //     count: 0,\n    //   };\n    //   seenTypeKeys.set(typeKeyPlusKey, seen);\n    // }\n\n    // let previousContent = seen.previous;\n    // seen.count++;\n\n    if (tagValidationData) {\n      // Increment the seen count for this tag\n      tagValidationData._seenCount++;\n\n      // This type key is valid. Now check if it's been seen before and if so, how many times\n      switch (typeKey) {\n        case TypeKey.Property: {\n          const { content: c, warning: w } = this.validatePropertyTag(\n            context,\n            contentDepth,\n            bitType,\n            tagValidationData,\n            content as TypeKeyValue,\n          );\n          validatedContent = c;\n          warning = w;\n          break;\n        }\n\n        case TypeKey.Resource: {\n          const { content: c, warning: w } = this.validateResourceTag(\n            context,\n            contentDepth,\n            bitType,\n            tagValidationData,\n            content as TypeKeyValue,\n          );\n          validatedContent = c;\n          warning = w;\n          break;\n        }\n\n        case TypeKey.CardSet: {\n          const { content: c, warning: w } = this.validateCardSet(\n            context,\n            bitType,\n            tagValidationData,\n            content as TypeKeyValue,\n            cardSetConfig,\n          );\n          validatedContent = c;\n          warning = w;\n          break;\n        }\n\n        default: {\n          const { content: c, warning: w } = this.validateStandardTag(\n            context,\n            contentDepth,\n            bitType,\n            tagValidationData,\n            content as TypeKeyValue,\n          );\n          validatedContent = c;\n          warning = w;\n        }\n      }\n    } else {\n      // type is not valid as no tag data exists for it\n      switch (typeKey) {\n        case TypeKey.Property: {\n          // The property is not valid for this bit type, but since we allow extra properties, we will return it as\n          // ok but with a warning\n          warning = { extraProperty: true };\n          if (contentDepth !== BitContentLevel.Chain) {\n            validatedContent = content; // Add tag anyway - we don't remove extra properties (unless in chain)\n          }\n          break;\n        }\n\n        case TypeKey.Resource: {\n          warning = { excessResource: true };\n          validatedContent = content; // Add tag anyway, will be added as an excess resource\n          break;\n        }\n\n        default:\n          warning = { invalid: true };\n      }\n    }\n\n    // Add a warning if there is one\n    if (warning) {\n      const previousContent = tagValidationData?._previous;\n\n      // TODO - warning and ignore\n      if (warning.invalid || warning.excessResource) {\n        warningStr = `${keyStr} is not valid here (incorrectly chained?).${ignoredStr}`;\n      } else if (warning.tooMany != null) {\n        warningStr = `${keyStr} is included more than the required ${warning.tooMany} time(s).`;\n        if (warning.tooMany === 0 && typeKey === TypeKey.Resource) {\n          warningStr += ` Did you forget the '${key}' in the bit header?`;\n        }\n        if (warning.tooMany > 0) warningStr += ' The earlier ones will be ignored';\n        // } else if (warning.tooFew != null) {\n        //   warningStr = `'${type}'${keyStr} is not included enough times(s). It should be included ${warning.tooFew} time(s)`;\n      } else if (warning.extraProperty) {\n        warningStr = `${keyStr} is an unknown property. It can be excluded from the output using the 'excludeUnknownProperties' flag`;\n      } else if (warning.unexpectedCardSet) {\n        warningStr = `${keyStr} is not expected here.${ignoredStr}`;\n      } else if (warning.unexpectedCardSideVariant) {\n        warningStr = `${keyStr} has a card / side / variant that is not expected here.${ignoredStr}`;\n      }\n\n      warning.warning = warningStr;\n      warning.content = validatedContent;\n      warning.previousContent = previousContent;\n    }\n\n    // Update the seen data\n    if (tagValidationData) {\n      tagValidationData._previous = content;\n    }\n\n    return {\n      validated: validatedContent,\n      warning,\n    };\n  }\n\n  /**\n   * Validates a standard bit tag\n   *\n   * @param context\n   * @param bitLevel\n   * @param bitType\n   * @param tagValidationData\n   * @param content\n   * @param seen\n   *\n   * @returns validated tag (plus warning message if one is generated) or undefined if the tag is invalid\n   */\n  private validateStandardTag(\n    _context: BitmarkPegParserContext,\n    _contentDepth: ContentDepthType,\n    _bitType: BitTypeType,\n    tagValidationData: TagValidationData,\n    content: TypeKeyValue,\n  ): ValidateReturn {\n    // Check if the property is valid for this bit type\n\n    const validCount = tagValidationData.maxCount == null ? 1 : tagValidationData.maxCount;\n\n    // If validCount is infinity, an infinite number of this type is allowed\n    if (validCount !== Count.infinity) {\n      if (tagValidationData._seenCount > validCount) {\n        return {\n          warning: { tooMany: validCount },\n          content: content, // Return content anyway when too many, as last wins\n        };\n      }\n    }\n\n    // If we get here, the property is valid and can be added\n    return {\n      content: content,\n    };\n  }\n\n  /**\n   * Validates a single property tag\n   *\n   * @param context\n   * @param bitLevel\n   * @param bitType\n   * @param tagValidationData\n   * @param content\n   * @param seen\n   *\n   * @returns validated tag (plus warning message if one is generated) or undefined if the tag is invalid\n   */\n  private validatePropertyTag(\n    _context: BitmarkPegParserContext,\n    _contentDepth: ContentDepthType,\n    _bitType: BitTypeType,\n    tagValidationData: TagValidationData,\n    content: TypeKeyValue,\n  ): ValidateReturn {\n    // Check if the property is valid for this bit type\n\n    const validCount = tagValidationData.maxCount == null ? 1 : tagValidationData.maxCount;\n\n    // If validCount is infinity, an infinite number of this type is allowed\n    if (validCount !== Count.infinity) {\n      if (tagValidationData._seenCount > validCount) {\n        return {\n          warning: { tooMany: validCount },\n          content: content, // Return content anyway when too many, as last wins\n        };\n      }\n    }\n\n    // If we get here, the property is valid and can be added\n    return {\n      content: content,\n    };\n  }\n\n  /**\n   * Validates a single resource tag\n   *\n   * @param context\n   * @param bitLevel\n   * @param bitType\n   * @param tagValidationData\n   * @param content\n   * @param seen\n   *\n   * @returns validated tag (plus warning message if one is generated) or undefined if the tag is invalid\n   */\n  private validateResourceTag(\n    _context: BitmarkPegParserContext,\n    _contentDepth: ContentDepthType,\n    _bitType: BitTypeType,\n    tagValidationData: TagValidationData,\n    content: TypeKeyValue,\n  ): ValidateReturn {\n    // Check if the resource is valid for this bit type\n\n    const validCount = tagValidationData.maxCount == null ? 1 : tagValidationData.maxCount;\n\n    // If validCount is infinity, an infinite number of this type is allowed\n    if (validCount !== Count.infinity) {\n      if (tagValidationData._seenCount > validCount) {\n        return {\n          warning: { tooMany: validCount },\n          content: content, // Return content anyway when too many, as last wins\n        };\n      }\n    }\n\n    // If we get here, the property is valid and can be added\n    return {\n      content: content,\n    };\n  }\n\n  /**\n   * Validates a card set\n   *\n   * @param context\n   * @param bitLevel\n   * @param bitType\n   * @param _tagValidationData\n   * @param content\n   * @param cardSetConfig\n   * @param depth recursion depth\n   *\n   * @returns validated tag (plus warning message if one is generated) or undefined if the tag is invalid\n   */\n  private validateCardSet(\n    context: BitmarkPegParserContext,\n    bitType: BitTypeType,\n    _tagValidationData: TagValidationData,\n    content: TypeKeyValue,\n    cardSetConfig: CardSetConfig | undefined,\n  ): ValidateReturn {\n    // if (context.DEBUG_BIT_TAG_VALIDATION) context.debugPrint('bit tag validation', data);\n\n    if (!cardSetConfig || !cardSetConfig.variants || cardSetConfig.variants.length === 0) {\n      // Card set exists with no card set config for the bit\n      return {\n        warning: { unexpectedCardSet: true },\n      };\n    }\n\n    const { value } = content;\n    const cardSet = value as ParsedCardSet;\n    let warning: WarningInfo | undefined;\n\n    // For each of the variants in the card set, validate its contents\n    let sideIndex = 0;\n    let variantIndex = 0;\n    for (const card of cardSet.cards) {\n      sideIndex = 0;\n      for (const side of card.sides) {\n        variantIndex = 0;\n        for (const variant of side.variants) {\n          const variantContent = variant.content;\n          let validatedContent: BitContent[] | undefined;\n          const variantConfig = Config.getCardSetVariantConfig(bitType, sideIndex, variantIndex);\n\n          if (variantConfig) {\n            // Validate the variant against the config\n            const res = this.validateTagChainsRecursive(\n              context,\n              BitContentLevel.Card,\n              bitType,\n              variantContent,\n              variantConfig.tags,\n            );\n            validatedContent = res.validated;\n          } else {\n            // TODO - warning!\n            warning = {\n              unexpectedCardSideVariant: true,\n            };\n          }\n\n          // TODO - add the validated content to the card set, or remove the invalid variant\n          if (validatedContent && validatedContent.length > 0) {\n            side.variants[variantIndex] = {\n              parser: variant.parser,\n              content: validatedContent,\n            };\n          } else {\n            // Variant is invalid, remove it\n            side.variants[variantIndex] = {\n              parser: variant.parser,\n              content: [],\n            };\n          }\n\n          variantIndex++;\n        }\n        sideIndex++;\n      }\n    }\n\n    return {\n      content: content,\n      warning,\n    };\n  }\n\n  /**\n   * Check the body of the bit for patterns which indicate common potential bitmark language mistakes.\n   *\n   * @param context\n   * @param _contentDepth\n   * @param bitType\n   * @param body\n   * @returns\n   */\n  private checkBodyForCommonPotentialMistakes(\n    context: BitmarkPegParserContext,\n    _contentDepth: ContentDepthType,\n    body: string,\n  ): void {\n    if (!body) return;\n\n    const { bitType } = context;\n\n    for (const mistake of COMMON_MISTAKE_STRINGS) {\n      if (body.includes(mistake)) {\n        context.addWarning(`Bit '${bitType}' might contain a mistake: ${mistake}`);\n      }\n    }\n\n    for (const mistake of COMMON_STARTS_WITH_MISTAKE_STRINGS) {\n      if (body.startsWith(mistake)) {\n        context.addWarning(`Bit '${bitType}' might contain a mistake: ${mistake}`);\n      }\n    }\n\n    for (const mistake of COMMON_ENDS_WITH_MISTAKE_STRINGS) {\n      if (body.endsWith(mistake)) {\n        context.addWarning(`Bit '${bitType}' might contain a mistake: ${mistake}`);\n      }\n    }\n  }\n\n  /**\n   * Convert the tag data configuration to TypeKeys\n   *\n   * @param context\n   * @param _contentDepth\n   * @param bitType\n   * @param tags\n   * @param depth recursion depth\n   * @returns\n   */\n  private convertTagsToTypeKeyMap(\n    _context: BitmarkPegParserContext,\n    _contentDepth: ContentDepthType,\n    _bitType: BitTypeType,\n    tags: TagsConfig,\n  ): Map<TypeKeyType | string, TagValidationData> {\n    // Using a map here as we might add the 'count' of tags valid at a later stage\n    const res = new Map<TypeKeyType | string, TagValidationData>();\n\n    // Add the tags\n    for (const v of Object.values(tags)) {\n      // Save the key in the TagData\n      const tagValidationData: TagValidationData = {\n        minCount: v.minCount,\n        maxCount: v.maxCount,\n        isTag: v.type === BitTagConfigKeyType.tag,\n        isProperty: v.type === BitTagConfigKeyType.property,\n        isResource: v.type === BitTagConfigKeyType.resource,\n        chain: v.chain,\n\n        // Private\n        _configKey: v.configKey,\n        _type: v.type,\n        _tag: v.tag,\n        _seenCount: 0,\n        _previous: undefined,\n      };\n\n      if (tagValidationData.isProperty) {\n        res.set(v.configKey, tagValidationData);\n      } else if (tagValidationData.isResource) {\n        res.set(v.configKey, tagValidationData);\n      } else {\n        // Take advantage of the same naming convention (dangerous - should be improved)\n        const typeKey = Enum(TypeKey).fromValue(v.tag);\n        if (typeKey) {\n          res.set(typeKey, tagValidationData);\n        }\n      }\n    }\n\n    return res;\n  }\n\n  private getTagSignature(tagValidationData: TagValidationData): string {\n    switch (tagValidationData._type) {\n      case BitTagConfigKeyType.tag:\n      case BitTagConfigKeyType.property:\n      case BitTagConfigKeyType.resource:\n        return `[${tagValidationData._configKey}]`;\n      default:\n        return `'${tagValidationData._type}' tag '${tagValidationData._tag}'`;\n    }\n  }\n\n  private getUnknownTagSignature(type: string, tag: string): string {\n    switch (type) {\n      case TypeKey.Property:\n      case TypeKey.Resource:\n        return `[${tag}]`;\n      default:\n        return tag ? `'${type}' tag '${tag}'` : `'${type}' tag`;\n    }\n  }\n}\n\nconst instance = new BitmarkPegParserValidator();\n\nexport { instance as BitmarkPegParserValidator };\n","import {\n  type JsonText,\n  type TextNode,\n  type TextNodeAttibutes,\n} from '../../../../model/ast/TextNodes.ts';\nimport { TextNodeType } from '../../../../model/enum/TextNodeType.ts';\n\nclass ContentProcessorUtils {\n  /**\n   * Concatenates a plain JSON text with a JsonText that may be plain (v2) or BitmarkText (v3)\n   * Returns the combined text.\n   *\n   * @param text the text to concatenate\n   * @param extraBreaks extra breaks to add between concatenated texts\n   * @param textPlain the plain text to concatenate\n   */\n  public concatenatePlainTextWithAstTexts(\n    text: JsonText,\n    extraBreaks: number,\n    textPlain: string,\n  ): JsonText {\n    if (Array.isArray(text)) {\n      textPlain = textPlain && textPlain.trim();\n      if (textPlain) {\n        const splitText = textPlain.split('\\n');\n        const content: TextNode[] = [];\n\n        for (let i = 0; i < extraBreaks; i++) {\n          content.push({\n            type: TextNodeType.hardBreak,\n          });\n        }\n\n        for (let i = 0; i < splitText.length; i++) {\n          const t = splitText[i];\n          if (t) {\n            content.push({\n              text: t,\n              type: TextNodeType.text,\n            });\n          }\n          // Add a hard break after each paragraph, except the last one\n          if (i < splitText.length - 1) {\n            content.push({\n              type: TextNodeType.hardBreak,\n            });\n          }\n        }\n\n        // Add the content to the final paragraph, or create a new one if there none\n        const lastNode = text[text.length - 1];\n        if (lastNode && lastNode.type === TextNodeType.paragraph) {\n          lastNode.content = [...(lastNode.content ?? []), ...content];\n        } else {\n          text.push({\n            type: TextNodeType.paragraph,\n            content,\n            attrs: {} as TextNodeAttibutes,\n          });\n        }\n      }\n      return text;\n    }\n\n    return `${text ?? ''}${'\\n'.repeat(extraBreaks)}${textPlain ?? ''}`;\n  }\n}\n\nconst instance = new ContentProcessorUtils();\nexport { instance as ContentProcessorUtils };\n","import { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { type Body, type BodyPart } from '../../../../model/ast/Nodes.ts';\nimport { type JsonText, type TextAst } from '../../../../model/ast/TextNodes.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { type BitTypeType } from '../../../../model/enum/BitType.ts';\nimport { BodyBitType } from '../../../../model/enum/BodyBitType.ts';\nimport { TextFormat, type TextFormatType } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport {\n  type BodyBitJson,\n  type GapJson,\n  type HighlightJson,\n  type MarkJson,\n  type SelectJson,\n} from '../../../../model/json/BodyBitJson.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport { TextParser } from '../../../text/TextParser.ts';\nimport {\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n} from '../BitmarkPegParserTypes.ts';\nimport { BitmarkPegParserValidator } from '../BitmarkPegParserValidator.ts';\nimport { ContentProcessorUtils } from './ContentProcessorUtils.ts';\n\nexport interface BodyText extends BodyPart {\n  type: 'text';\n  data: {\n    bodyText: BreakscapedString;\n    isPlain: boolean;\n  };\n}\n\nconst textParser = new TextParser();\n\nclass BodyContentProcessor {\n  public process(\n    context: BitmarkPegParserContext,\n    contentDepth: ContentDepthType,\n    bitType: BitTypeType,\n    textFormat: TextFormatType,\n    _tagsConfig: TagsConfig | undefined,\n    _target: BitContentProcessorResult,\n    bodyParts: BodyPart[],\n    isCardBody: boolean,\n  ): Partial<Body> | undefined {\n    const bodyBits: BodyBitJson[] = [];\n    let finalBody: JsonText | unknown | undefined;\n    let finalBodyString: string | undefined;\n    //\n    const trimmedBodyParts = bodyParts.length > 0 ? this.trimBodyParts(bodyParts) : undefined;\n    const validatedBodyParts = isCardBody\n      ? trimmedBodyParts\n      : BitmarkPegParserValidator.checkBody(\n          context,\n          contentDepth,\n          bitType,\n          textFormat,\n          trimmedBodyParts,\n        );\n\n    // If the text format is JSON, check the body is valid JSON\n    // In this case, the body will already have been 'squashed' so will not contain any parsed inline body tags\n    if (textFormat === TextFormat.json && validatedBodyParts) {\n      finalBody = validatedBodyParts.reduce((acc, val) => {\n        if (val.type === BodyBitType.text && val.data) {\n          const bodyTextVal = val as BodyText;\n          return (acc + (bodyTextVal.data.bodyText ?? '')) as string;\n        }\n        return acc;\n      }, '');\n      try {\n        finalBody = JSON.parse(finalBody as string);\n      } catch (_e) {\n        finalBody = null;\n        context.addError(`Body JSON is invalid.`);\n      }\n    } else {\n      // Standard body\n\n      let bodyTextStr: BreakscapedString = '' as BreakscapedString;\n      let plainBodyTextStr: BreakscapedString = '' as BreakscapedString;\n      let bodyStr: BreakscapedString = '' as BreakscapedString;\n      let placeholderIndex = 0;\n\n      // Function for creating the placeholder keys\n      const createPlaceholderKey = (i: number): BreakscapedString => `[!${i}]` as BreakscapedString;\n\n      // Loop the text bodyParts creating full body text with the correct placeholders\n      //\n      // fullBodyTextStr:\n      // - is created and passed into the text parser to create the body text AST\n      // - has placeholders inserted into 'fullBodyTextStr' in the format [!0] to allow the text parser to identify\n      //   where the body bits should be inserted.\n      //\n      if (validatedBodyParts) {\n        for (let i = 0; i < validatedBodyParts.length; i++) {\n          const bodyPart = validatedBodyParts[i];\n\n          const isText = bodyPart.type === BodyBitType.text;\n\n          if (isText) {\n            const asText = bodyPart as BodyText;\n            const bodyTextPart = asText.data.bodyText;\n\n            // Append the text part to the full text body\n            if (asText.data.isPlain) {\n              plainBodyTextStr = Breakscape.concatenate(plainBodyTextStr, bodyTextPart);\n            } else {\n              bodyTextStr = Breakscape.concatenate(bodyTextStr, bodyTextPart);\n            }\n            bodyStr = Breakscape.concatenate(bodyStr, bodyTextPart);\n          } else {\n            const placeholderKey = createPlaceholderKey(placeholderIndex);\n\n            // Append the placeholder to the full text body\n            bodyTextStr = Breakscape.concatenate(bodyTextStr, placeholderKey);\n\n            // Add the body bit to the body bits\n            bodyBits.push(bodyPart as BodyBitJson);\n\n            placeholderIndex++;\n          }\n        }\n      }\n\n      // Create the body text AST\n      const isBitmarkText = textFormat === TextFormat.bitmarkText;\n\n      const parsedBodyText: JsonText = isBitmarkText\n        ? textParser.toAst(bodyTextStr, {\n            //\n            format: textFormat,\n            location: TextLocation.body,\n          })\n        : Breakscape.unbreakscape(bodyTextStr, {\n            format: TextFormat.plainText,\n            location: TextLocation.body,\n          });\n\n      const parserPlainText: JsonText = Breakscape.unbreakscape(plainBodyTextStr, {\n        format: TextFormat.plainText,\n        location: TextLocation.body,\n      });\n\n      // Newlines will have been lost from the end of bodyTextStr, and start of plainBodyTextStr\n      // Count then and add them back when merging\n      const newlines =\n        StringUtils.countOccurrencesAtEnd(bodyTextStr, '\\n') +\n        StringUtils.countOccurrencesAtStart(plainBodyTextStr, '\\n');\n\n      finalBody = ContentProcessorUtils.concatenatePlainTextWithAstTexts(\n        parsedBodyText,\n        newlines,\n        parserPlainText,\n      );\n      finalBodyString = Breakscape.unbreakscape(bodyStr, {\n        format: textFormat,\n        location: TextLocation.body,\n      }).trim() as BreakscapedString;\n      const finalBodyIsAst = Array.isArray(finalBody);\n      const bodyAst = finalBodyIsAst ? (finalBody as TextAst) : undefined;\n\n      // Loop the body parts again to create the body bits:\n      // - The body bits are inserted into body AST, replacing the placeholders created by the text parser\n      if (bodyAst && validatedBodyParts) {\n        placeholderIndex = 0;\n        for (let i = 0; i < validatedBodyParts.length; i++) {\n          const bodyPart = validatedBodyParts[i];\n\n          // Skip text body parts as they are handled above\n          const isText = bodyPart.type === BodyBitType.text;\n          if (isText) continue;\n\n          const bodyBit = bodyPart as BodyBitJson;\n          let bodyBitJson: BodyBitJson | undefined;\n\n          switch (bodyPart.type) {\n            case BodyBitType.gap: {\n              // const gap = bodyBit as Gap;\n              // bodyBitJson = this.createGapJson(gap);\n              bodyBitJson = bodyBit as GapJson;\n              break;\n            }\n\n            case BodyBitType.mark: {\n              // const mark = bodyBit as Mark;\n              // bodyBitJson = this.createMarkJson(mark);\n              bodyBitJson = bodyBit as MarkJson;\n              break;\n            }\n\n            case BodyBitType.select: {\n              // const select = bodyBit as SelectJson;\n              // bodyBitJson = this.createSelectJson(select);\n              bodyBitJson = bodyBit as SelectJson;\n              break;\n            }\n\n            case BodyBitType.highlight: {\n              // const highlight = bodyBit as Highlight;\n              // bodyBitJson = this.createHighlightJson(highlight);\n              bodyBitJson = bodyBit as HighlightJson;\n              break;\n            }\n          }\n\n          // Add the gap to the placeholders\n          if (bodyBitJson) {\n            // Insert the body bit into the body AST\n            this.replacePlaceholderWithBodyBit(bodyAst, bodyBitJson, placeholderIndex);\n          }\n\n          placeholderIndex++;\n        }\n      }\n    } // Standard body\n\n    // Return the body in the target\n    return {\n      body: finalBody,\n      bodyBits: bodyBits.length > 0 ? bodyBits : undefined,\n      bodyString: finalBodyString,\n    };\n  }\n\n  public buildBodyText(bodyTextPart: BreakscapedString, isPlain: boolean): BodyText {\n    const bodyText: BodyText = {\n      type: BodyBitType.text,\n      data: {\n        bodyText: bodyTextPart,\n        isPlain,\n      },\n    };\n    return bodyText;\n  }\n\n  /**\n   * Walk the body AST to find the placeholder and replace it with the body bit.\n   *\n   * @param bodyAst the body AST\n   * @param bodyBitJson the body bit json to insert at the placeholder position\n   * @param index the index of the placeholder to replace\n   */\n  protected replacePlaceholderWithBodyBit(\n    bodyAst: TextAst,\n    bodyBitJson: BodyBitJson,\n    index: number,\n  ) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const walkRecursive = (node: any, parent: any, parentKey: any): boolean => {\n      if (Array.isArray(node)) {\n        // Walk the array of nodes\n        for (let i = 0; i < node.length; i++) {\n          const child = node[i];\n          const done = walkRecursive(child, node, i);\n          if (done) return true;\n        }\n      } else {\n        if (node.type === 'bit' && node.index === index) {\n          // Found the placeholder, replace it with the body bit\n          parent[parentKey] = bodyBitJson;\n          return true;\n        }\n        if (node.content) {\n          // Walk the child content\n          const done = walkRecursive(node.content, node, 'content');\n          if (done) return true;\n        }\n      }\n      return false;\n    };\n\n    walkRecursive(bodyAst, null, null);\n  }\n\n  /**\n   * Trim the body parts, removing any whitespace only parts at start and end of body\n   *\n   * @param parts the body parts to trim\n   * @returns the trimmed body parts\n   */\n  private trimBodyParts(parts: BodyPart[]): BodyPart[] {\n    // Trim start\n    let foundText = false;\n    let trimmedParts: BodyPart[] = parts.reduce((acc, part) => {\n      const text = part as BodyText;\n      if (!foundText && text.type === BodyBitType.text) {\n        const t = text.data.bodyText.trimStart() as BreakscapedString;\n        if (t) {\n          foundText = true;\n          text.data.bodyText = t;\n          acc.push(text);\n        }\n      } else {\n        // Not body text, so add it\n        foundText = true;\n        acc.push(part);\n      }\n      return acc;\n    }, [] as BodyPart[]);\n\n    // Trim end\n    foundText = false;\n    trimmedParts = trimmedParts.reduceRight((acc, part) => {\n      const text = part as BodyText;\n      if (!foundText && text.type === BodyBitType.text) {\n        const t = text.data.bodyText.trimEnd() as BreakscapedString;\n        if (t) {\n          foundText = true;\n          text.data.bodyText = t;\n          acc.unshift(text);\n        }\n      } else {\n        // Not body text, so add it\n        foundText = true;\n        acc.unshift(part);\n      }\n      return acc;\n    }, [] as BodyPart[]);\n\n    return trimmedParts;\n  }\n}\n\nconst instance = new BodyContentProcessor();\nexport { instance as BodyContentProcessor };\n","import { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { Config } from '../../../../config/Config.ts';\nimport { type CardBit, type ExtraProperties } from '../../../../model/ast/Nodes.ts';\nimport { type JsonText, type TextAst } from '../../../../model/ast/TextNodes.ts';\nimport { CardSetConfigKey } from '../../../../model/config/enum/CardSetConfigKey.ts';\nimport { BitType, type BitTypeType } from '../../../../model/enum/BitType.ts';\nimport { BodyBitType } from '../../../../model/enum/BodyBitType.ts';\nimport { ResourceType } from '../../../../model/enum/ResourceType.ts';\nimport { type TextFormatType } from '../../../../model/enum/TextFormat.ts';\nimport {\n  type BotResponseJson,\n  type ChoiceJson,\n  type DefinitionListItemJson,\n  type ExampleJson,\n  type FeedbackChoiceJson,\n  type FeedbackJson,\n  type FeedbackReasonJson,\n  type FlashcardJson,\n  type HeadingJson,\n  type IngredientJson,\n  type MatrixCellJson,\n  type MatrixJson,\n  type PairJson,\n  type PronunciationTableCellJson,\n  type PronunciationTableJson,\n  type QuestionJson,\n  type QuizJson,\n  type ResponseJson,\n  type StatementJson,\n  type TableCellJson,\n  type TableExtendedJson,\n  type TableRowJson,\n  type TextAndIconJson,\n} from '../../../../model/json/BitJson.ts';\nimport { type SelectJson } from '../../../../model/json/BodyBitJson.ts';\nimport {\n  type AudioResourceWrapperJson,\n  type ImageResourceWrapperJson,\n} from '../../../../model/json/ResourceJson.ts';\nimport { NumberUtils } from '../../../../utils/NumberUtils.ts';\nimport {\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type BitSpecificCards,\n  type ParsedCardSet,\n  type ProcessedCard,\n  type ProcessedCardSet,\n  type ProcessedCardSide,\n  type ProcessedCardVariant,\n} from '../BitmarkPegParserTypes.ts';\nimport { BitmarkPegParserValidator } from '../BitmarkPegParserValidator.ts';\n\ninterface HeadingData {\n  heading: HeadingJson;\n  isDefaultExampleCardSet: boolean;\n  exampleCardSet: ExampleJson | undefined;\n}\n\nfunction buildCards(\n  context: BitmarkPegParserContext,\n  bitType: BitTypeType,\n  textFormat: TextFormatType,\n  parsedCardSet: ParsedCardSet | undefined,\n  statementV1: Partial<StatementJson> | undefined,\n  statementsV1: Partial<StatementJson>[] | undefined,\n  choicesV1: Partial<ChoiceJson>[] | undefined,\n  responsesV1: Partial<ResponseJson>[] | undefined,\n): BitSpecificCards {\n  const { bitConfig } = context;\n\n  if (context.DEBUG_CARD_SET) context.debugPrint('card set', parsedCardSet);\n\n  let result: BitSpecificCards = {};\n\n  // Process the card contents\n  const processedCardSet = processCardSet(context, parsedCardSet);\n\n  // Parse the card contents according to the card set type\n\n  // Get the bit metadata to check how to parse the card set\n  const cardSetType = bitConfig.cardSet?.configKey;\n\n  switch (cardSetType) {\n    case CardSetConfigKey.flashcard:\n    case CardSetConfigKey.flashcard1:\n    case CardSetConfigKey.definitionList:\n    case CardSetConfigKey.definitionListPlain:\n      result = parseFlashcardOrDefinitionList(context, bitType, processedCardSet);\n      break;\n\n    case CardSetConfigKey.elements:\n      result = parseElements(context, bitType, processedCardSet);\n      break;\n\n    case CardSetConfigKey.statements:\n      result = parseStatements(context, bitType, processedCardSet, statementV1, statementsV1);\n      break;\n\n    case CardSetConfigKey.feedback:\n      result = parseFeedback(context, bitType, processedCardSet);\n      break;\n\n    case CardSetConfigKey.quiz:\n    case CardSetConfigKey.quizResponses:\n      result = parseQuiz(context, bitType, processedCardSet, choicesV1, responsesV1);\n      break;\n\n    case CardSetConfigKey.questions:\n      result = parseQuestions(context, bitType, processedCardSet);\n      break;\n\n    case CardSetConfigKey.matchPairs:\n      // ==> heading / pairs\n      result = parseMatchPairs(context, bitType, processedCardSet);\n      break;\n\n    case CardSetConfigKey.matchMatrix:\n      // ==> heading / matrix\n      result = parseMatchMatrix(context, bitType, processedCardSet);\n      break;\n\n    case CardSetConfigKey.pronunciationTable:\n      result = parsePronunciationTable(context, bitType, processedCardSet);\n      break;\n\n    case CardSetConfigKey.table:\n    case CardSetConfigKey.tableExtended:\n      // ==> heading / table\n      result = parseTable(context, bitType, processedCardSet);\n      break;\n\n    case CardSetConfigKey.botActionResponses:\n      result = parseBotActionResponses(context, bitType, processedCardSet);\n      break;\n\n    case CardSetConfigKey.ingredients:\n      result = parseIngredients(context, bitType, processedCardSet);\n      break;\n\n    case CardSetConfigKey.clozeList:\n    case CardSetConfigKey.exampleBitList:\n    case CardSetConfigKey.pageFooterSections:\n    case CardSetConfigKey.bookReferenceList:\n      result = parseCardBits(context, bitType, textFormat, processedCardSet);\n      break;\n\n    // DEPRECATED - REMOVE IN THE FUTURE\n    // case CardSetConfigKey._captionDefinitionsList:\n    //   // ==> captionDefinitionsList\n    //   result = parseCaptionDefinitionsList(context, bitType, processedCardSet);\n    //   break;\n\n    default:\n    // Return default empty object\n  }\n\n  // Add the internal comments\n  result.internalComments =\n    processedCardSet.internalComments.length > 0 ? processedCardSet.internalComments : undefined;\n\n  return result;\n}\n\nfunction processCardSet(\n  context: BitmarkPegParserContext,\n  parsedCardSet: ParsedCardSet | undefined,\n): ProcessedCardSet {\n  const processedCardSet: ProcessedCardSet = {\n    cards: [],\n    internalComments: [],\n  };\n\n  // Early return if no card set\n  if (!parsedCardSet) return processedCardSet;\n\n  const { bitType } = context;\n\n  // Process the card contents\n  let cardNo = 0;\n  let sideNo = 0;\n  let variantNo = 0;\n  for (const card of parsedCardSet.cards) {\n    const processedCard: ProcessedCard = {\n      no: cardNo++,\n      sides: [],\n      qualifier: card.qualifier,\n    };\n    processedCardSet.cards.push(processedCard);\n    for (const side of card.sides) {\n      const processedSide: ProcessedCardSide = {\n        no: sideNo++,\n        variants: [],\n        qualifier: side.qualifier,\n      };\n      processedCard.sides.push(processedSide);\n      for (const variant of side.variants) {\n        const { parser, content } = variant;\n        const processedVariant: ProcessedCardVariant = {\n          parser,\n          no: variantNo++,\n          qualifier: variant.qualifier,\n        } as ProcessedCardVariant;\n        processedSide.variants.push(processedVariant);\n\n        const tagsConfig = Config.getTagsConfigForCardSet(bitType, sideNo, variantNo);\n\n        const tags = context.bitContentProcessor(BitContentLevel.Card, tagsConfig, content);\n\n        if (context.DEBUG_CARD_TAGS) context.debugPrint('card tags', tags);\n\n        // Validate the cardBody\n        tags.cardBody = BitmarkPegParserValidator.checkCardBody(\n          context,\n          BitContentLevel.Card,\n          bitType,\n          tags.cardBody,\n          processedCard.no,\n          processedSide.no,\n          processedVariant.no,\n        );\n        // Reduce the card body parts to a breakscaped string\n        tags.cardBodyStr = tags.cardBody?.bodyString;\n\n        processedVariant.data = tags;\n\n        // Add any internal comments\n        if (tags.internalComments) processedCardSet.internalComments.push(...tags.internalComments);\n      }\n      variantNo = 0;\n    }\n    sideNo = 0;\n  }\n\n  return processedCardSet;\n}\n\nfunction parseFlashcardOrDefinitionList(\n  context: BitmarkPegParserContext,\n  bitType: BitTypeType,\n  cardSet: ProcessedCardSet,\n): BitSpecificCards {\n  const flashcards: Partial<FlashcardJson>[] = [];\n  const definitions: Partial<DefinitionListItemJson>[] = [];\n  let questionStr = '';\n  let question: Partial<TextAndIconJson> | undefined;\n  let answer: Partial<TextAndIconJson> | undefined;\n  let alternativeAnswers: Partial<TextAndIconJson>[] = [];\n  let variantIndex = 0;\n  let extraTags: BitContentProcessorResult = {};\n  let questionVariant: ProcessedCardVariant | undefined;\n  const onlyOneCardAllowed = bitType === BitType.flashcard1;\n\n  // Extract the heading card if it exists\n  const headingData = extractHeadingCard(cardSet);\n\n  for (let cardIdx = 0; cardIdx < cardSet.cards.length; cardIdx++) {\n    const card = cardSet.cards[cardIdx];\n\n    // Skip the headings card if it exists\n    if (headingData && cardIdx === 0) continue;\n\n    // Reset the question and answers\n    question = undefined;\n    answer = undefined;\n    alternativeAnswers = [];\n    variantIndex = 0;\n    extraTags = {};\n\n    for (const side of card.sides) {\n      for (const content of side.variants) {\n        const { cardBody, resources, ...tags } = content.data;\n        extraTags = {\n          ...extraTags,\n          ...tags,\n        };\n        const icon =\n          resources && resources.length > 0\n            ? (resources[0] as ImageResourceWrapperJson)\n            : undefined;\n        const text = cardBody?.body as TextAst;\n        const str = cardBody?.bodyString ?? '';\n\n        if (variantIndex === 0) {\n          questionVariant = content;\n          questionStr = str;\n          question = {\n            text,\n            icon,\n          };\n        } else if (variantIndex === 1) {\n          answer = {\n            text,\n            icon,\n          };\n        } else {\n          alternativeAnswers.push({\n            text,\n            icon: icon,\n          });\n        }\n        variantIndex++;\n      }\n    }\n\n    // Add the flashcard\n    if (cardIdx === 0 || !onlyOneCardAllowed) {\n      if (Config.isOfBitType(bitType, [BitType.flashcard])) {\n        // .flashcard\n        // if (question) {\n        const fc: Partial<FlashcardJson> = {\n          question: question as TextAndIconJson,\n          answer: answer as TextAndIconJson,\n          alternativeAnswers: alternativeAnswers as TextAndIconJson[],\n          ...extraTags,\n        };\n        if (fc) flashcards.push(fc);\n        // } else {\n        //   context.addWarning('Ignoring card with empty question', questionVariant);\n        // }\n      } else {\n        // .definition-list, etc\n        const dl: Partial<DefinitionListItemJson> = {\n          term: question as TextAndIconJson,\n          definition: answer as TextAndIconJson,\n          alternativeDefinitions: alternativeAnswers as TextAndIconJson[],\n          ...extraTags,\n        };\n        if (dl) definitions.push(dl);\n      }\n    } else {\n      // Only one card allowed, add a warning and ignore the card\n      context.addWarning(\n        `Bit '${bitType}' should only contain one card. Ignore subsequent card: '${questionStr}'`,\n        questionVariant,\n      );\n      break;\n    }\n  }\n\n  return {\n    heading: headingData?.heading,\n    flashcards: flashcards.length > 0 ? flashcards : undefined,\n    definitions: definitions.length > 0 ? definitions : undefined,\n  };\n}\n\nfunction parseElements(\n  _context: BitmarkPegParserContext,\n  _bitType: BitTypeType,\n  cardSet: ProcessedCardSet,\n): BitSpecificCards {\n  const elements: JsonText[] = [];\n\n  for (const card of cardSet.cards) {\n    for (const side of card.sides) {\n      for (const content of side.variants) {\n        const tags = content.data;\n\n        // if (tags.cardBody) {\n        const element =\n          (tags.cardBody?.body as JsonText) ?? tags.cardBodyStr ?? Breakscape.EMPTY_STRING;\n        elements.push(element);\n        // } else {\n        //   context.addWarning('Ignoring card with empty element', content);\n        // }\n      }\n    }\n  }\n\n  return {\n    elements: elements.length > 0 ? elements : undefined,\n  };\n}\n\nfunction parseStatements(\n  _context: BitmarkPegParserContext,\n  _bitType: BitTypeType,\n  cardSet: ProcessedCardSet,\n  statementV1: Partial<StatementJson> | undefined,\n  statementsV1: Partial<StatementJson>[] | undefined,\n): BitSpecificCards {\n  const statements: Partial<StatementJson>[] = [];\n\n  for (const card of cardSet.cards) {\n    for (const side of card.sides) {\n      for (const content of side.variants) {\n        const { statements: chainedStatements, statement: _ignore, ...tags } = content.data;\n\n        // Re-build the statement, adding any tags that were not in the True/False chain\n        // These tags are actually not in the correct place, but we can still interpret them and fix the data.\n        // As .true-false only has one statement per card, we can just add the extra tags to the statement.\n        if (Array.isArray(chainedStatements)) {\n          for (const s of chainedStatements) {\n            // if (s.text) {\n            const statement: Partial<StatementJson> = {\n              statement: s.statement ?? [],\n              isCorrect: s.isCorrect,\n              item: s.item,\n              lead: s.lead,\n              hint: s.hint,\n              instruction: s.instruction,\n              example: s.example,\n              ...tags,\n            };\n            if (statement) statements.push(statement);\n            // } else {\n            //   context.addWarning('Ignoring card with empty statement', content);\n            // }\n          }\n        }\n      }\n    }\n  }\n\n  // Add the V1 statement to the end of the statements array to improve backwards compatibility\n  if (statementV1) {\n    statements.push(statementV1);\n  }\n\n  // Add the V1 statements to the end of the statements array to improve backwards compatibility\n  if (Array.isArray(statementsV1) && statementsV1.length > 0) {\n    statements.push(...statementsV1);\n  }\n\n  return {\n    statements: statements.length > 0 ? statements : undefined,\n  };\n}\n\nfunction parseFeedback(\n  _context: BitmarkPegParserContext,\n  _bitType: BitTypeType,\n  cardSet: ProcessedCardSet,\n): BitSpecificCards {\n  let feedback: Partial<FeedbackJson> | undefined;\n  const feedbacks: Partial<FeedbackJson>[] = [];\n\n  // Extract the heading card if it exists\n  const headingData = extractHeadingCard(cardSet);\n\n  for (let cardIdx = 0; cardIdx < cardSet.cards.length; cardIdx++) {\n    const card = cardSet.cards[cardIdx];\n\n    // Skip the headings card if it exists\n    if (headingData && cardIdx === 0) continue;\n\n    feedback = undefined;\n\n    for (let sideIdx = 0; sideIdx < card.sides.length; sideIdx++) {\n      const side = card.sides[sideIdx];\n\n      for (const content of side.variants) {\n        const tags = content.data;\n\n        const { cardBody, cardBodyStr, choices: choiceTags, ...restTags } = tags;\n\n        if (sideIdx === 0) {\n          // First side (feedback choices)\n\n          const choices: Partial<FeedbackChoiceJson>[] = [];\n\n          if (choiceTags && choiceTags.length > 0) {\n            for (const tf of choiceTags) {\n              const { __isDefaultExample, example, ...tfTags } = tf;\n\n              const choice: Partial<FeedbackChoiceJson> = {\n                choice: tfTags.choice,\n                requireReason: tfTags.isCorrect,\n                item: tfTags.item,\n                lead: tfTags.lead,\n                instruction: tfTags.instruction,\n                __isDefaultExample,\n                example,\n              };\n              choices.push(choice);\n            }\n          }\n\n          // if (tags.choices || tags.responses) {\n          feedback = {\n            ...tags,\n            choices: choices as FeedbackChoiceJson[],\n          };\n          if (feedback) feedbacks.push(feedback);\n        } else if (sideIdx === 1) {\n          // Second side (feedback reason)\n          const reason: Partial<FeedbackReasonJson> = {\n            text: cardBodyStr ?? '',\n            __textAst: cardBody?.body as TextAst,\n            ...restTags,\n          };\n          if (feedback) {\n            feedback.reason = reason as FeedbackReasonJson;\n          }\n        }\n      }\n    }\n  }\n\n  return {\n    heading: headingData?.heading,\n    feedbacks: feedbacks.length > 0 ? feedbacks : undefined,\n  };\n}\n\nfunction parseQuiz(\n  _context: BitmarkPegParserContext,\n  bitType: BitTypeType,\n  cardSet: ProcessedCardSet,\n  choicesV1: Partial<ChoiceJson>[] | undefined,\n  responsesV1: Partial<ResponseJson>[] | undefined,\n): BitSpecificCards {\n  const quizzes: Partial<QuizJson>[] = [];\n  const insertChoices = Config.isOfBitType(bitType, BitType.multipleChoice);\n  const insertResponses = Config.isOfBitType(bitType, BitType.multipleResponse);\n  if (!insertChoices && !insertResponses) return {};\n\n  let isDefaultExampleCard = false;\n  let exampleCard: ExampleJson | undefined;\n\n  for (const card of cardSet.cards) {\n    isDefaultExampleCard = false;\n    exampleCard = undefined;\n\n    for (const side of card.sides) {\n      for (const content of side.variants) {\n        const { __isDefaultExample, example, ...tags } = content.data;\n\n        // Example\n        isDefaultExampleCard = __isDefaultExample === true ? true : isDefaultExampleCard;\n        exampleCard = example ? example : exampleCard;\n\n        // Insert choices / responses\n        if (tags.trueFalse && tags.trueFalse.length > 0) {\n          const responsesOrChoices: (Partial<ChoiceJson> | Partial<ResponseJson>)[] = [];\n\n          for (const tf of tags.trueFalse) {\n            const { __isDefaultExample: isDefaultExampleTf, example: exampleTf, ...tfTags } = tf;\n            const __isDefaultExample = isDefaultExampleTf || isDefaultExampleCard;\n            const example = exampleTf || exampleCard;\n\n            const response: Partial<ChoiceJson> & Partial<ResponseJson> = {\n              isCorrect: tfTags.isCorrect,\n              __isDefaultExample,\n              example,\n            };\n            if (insertResponses) response.response = tfTags.text;\n            else response.choice = tfTags.text;\n            if (response) responsesOrChoices.push(response);\n          }\n\n          if (insertResponses) tags.responses = responsesOrChoices as Partial<ResponseJson>[];\n          else tags.choices = responsesOrChoices as Partial<ChoiceJson>[];\n        }\n\n        // if (tags.choices || tags.responses) {\n        const quiz: Partial<QuizJson> = {\n          ...tags,\n          choices: tags.choices as ChoiceJson[],\n          responses: tags.responses as ResponseJson[],\n          __isDefaultExample: isDefaultExampleCard,\n          __defaultExample: exampleCard,\n        };\n        if (quiz) quizzes.push(quiz);\n        // } else {\n        //   context.addWarning('Ignoring card with empty quiz', content);\n        // }\n      }\n    }\n  }\n\n  // Add a quiz for the V1 choices / responses\n  if (insertChoices && Array.isArray(choicesV1) && choicesV1.length > 0) {\n    const quiz: Partial<QuizJson> = {\n      choices: choicesV1 as ChoiceJson[],\n    };\n    if (quiz) quizzes.push(quiz);\n  }\n  if (insertResponses && Array.isArray(responsesV1) && responsesV1.length > 0) {\n    const quiz: Partial<QuizJson> = {\n      responses: responsesV1 as ResponseJson[],\n    };\n    if (quiz) quizzes.push(quiz);\n  }\n\n  return {\n    quizzes: quizzes.length > 0 ? quizzes : undefined,\n  };\n}\n\nfunction parseQuestions(\n  _context: BitmarkPegParserContext,\n  _bitType: BitTypeType,\n  cardSet: ProcessedCardSet,\n): BitSpecificCards {\n  const questions: Partial<QuestionJson>[] = [];\n\n  for (const card of cardSet.cards) {\n    for (const side of card.sides) {\n      for (const content of side.variants) {\n        const tags = content.data;\n\n        // if (tags.cardBody) {\n        const q: Partial<QuestionJson> = {\n          question:\n            (tags.cardBody?.body as JsonText) ?? tags.cardBodyStr ?? Breakscape.EMPTY_STRING,\n          ...tags,\n        };\n        if (q) questions.push(q);\n        // }\n        // else {\n        //   context.addWarning('Ignoring card with empty body text', content);\n        // }\n      }\n    }\n  }\n\n  return {\n    questions: questions.length > 0 ? questions : undefined,\n  };\n}\n\nfunction parseMatchPairs(\n  _context: BitmarkPegParserContext,\n  bitType: BitTypeType,\n  cardSet: ProcessedCardSet,\n): BitSpecificCards {\n  const pairs: Partial<PairJson>[] = [];\n  let pairKey: string | undefined = undefined;\n  let pairValues: string[] = [];\n  let _pairValuesAst: TextAst[] = [];\n  let keyAudio: AudioResourceWrapperJson | undefined = undefined;\n  let keyImage: ImageResourceWrapperJson | undefined = undefined;\n  let extraTags: BitContentProcessorResult = {};\n  let isDefaultExampleCard = false;\n  let exampleCard: ExampleJson | undefined;\n  // let variant: ProcessedCardVariant | undefined;\n\n  // Extract the heading card if it exists\n  const headingValuesIsArray = Config.isOfBitType(bitType, BitType.matchMatrix);\n  const headingData = extractHeadingCard(cardSet, headingValuesIsArray);\n\n  const isDefaultExampleCardSet = headingData?.isDefaultExampleCardSet ?? false;\n  let exampleCardSet = headingData?.exampleCardSet;\n\n  for (let cardIdx = 0; cardIdx < cardSet.cards.length; cardIdx++) {\n    const card = cardSet.cards[cardIdx];\n\n    // Skip the headings card if it exists\n    if (headingData && cardIdx === 0) continue;\n\n    pairKey = undefined;\n    pairValues = [];\n    _pairValuesAst = [];\n    keyAudio = undefined;\n    keyImage = undefined;\n    extraTags = {};\n    isDefaultExampleCard = false;\n    exampleCard = undefined;\n\n    for (let sideIdx = 0; sideIdx < card.sides.length; sideIdx++) {\n      const side = card.sides[sideIdx];\n\n      for (const content of side.variants) {\n        // variant = content;\n        const { cardBody, cardBodyStr, resources, __isDefaultExample, example, ...tags } =\n          content.data;\n\n        // Example\n        isDefaultExampleCard = __isDefaultExample === true ? true : isDefaultExampleCard;\n        exampleCard = example ? (example as TextAst) : exampleCard;\n\n        if (sideIdx === 0) {\n          // First side\n          if (Array.isArray(resources) && resources.length > 0) {\n            // TODO - should search the correct resource type based on the bit type\n            const resource = resources[0];\n            // console.log('WARNING: Match card has resource on first side', tags.resource);\n            if (resource.type === ResourceType.audio) {\n              keyAudio = resource as AudioResourceWrapperJson;\n            } else if (resource.type === ResourceType.image) {\n              keyImage = resource as ImageResourceWrapperJson;\n            }\n          } else {\n            // If not a heading or resource, it is a pair\n            pairKey = cardBodyStr;\n          }\n        } else {\n          // Subsequent sides (pair)\n          const value = cardBodyStr ?? '';\n          const valueAst = cardBody?.body as TextAst;\n          pairValues.push(value);\n          _pairValuesAst.push(valueAst);\n          if ((isDefaultExampleCardSet || isDefaultExampleCard) && !exampleCard)\n            exampleCard = valueAst;\n\n          // Fix: https://github.com/getMoreBrain/cosmic/issues/5454\n          delete tags.item;\n          delete tags.lead;\n        }\n\n        // Extra tags\n        extraTags = {\n          ...extraTags,\n          ...tags,\n        };\n      }\n    }\n\n    // if (pairKey || keyAudio || keyImage) {\n    // Calculate final example and __isDefaultExample\n    if (isDefaultExampleCard) exampleCardSet = undefined;\n    const __isDefaultExample = isDefaultExampleCard || isDefaultExampleCardSet;\n    const example = exampleCard || exampleCardSet;\n\n    const pair: Partial<PairJson> = {\n      key: pairKey ?? '',\n      keyAudio,\n      keyImage,\n      values: pairValues,\n      __valuesAst: _pairValuesAst,\n      ...extraTags,\n      __isDefaultExample,\n      example,\n    };\n    if (pair) pairs.push(pair);\n    // } else {\n    //   context.addWarning('Ignoring card with empty body text', variant);\n    // }\n  }\n\n  return {\n    heading: headingData?.heading,\n    pairs: pairs.length > 0 ? pairs : undefined,\n  };\n}\n\nfunction parseMatchMatrix(\n  _context: BitmarkPegParserContext,\n  _bitType: BitTypeType,\n  cardSet: ProcessedCardSet,\n): BitSpecificCards {\n  let matrixKey: string | undefined = undefined;\n  let matrixKeyTags: BitContentProcessorResult | undefined = undefined;\n  const matrix: Partial<MatrixJson>[] = [];\n  let matrixCells: Partial<MatrixCellJson>[] = [];\n  let matrixCellValues: string[] = [];\n  let _matrixCellValuesAst: TextAst[] = [];\n  let matrixCellTags: BitContentProcessorResult = {};\n  let isDefaultExampleCard = false;\n  let exampleCard: ExampleJson | undefined;\n  let isDefaultExampleSide = false;\n  let exampleSide: ExampleJson | undefined;\n  let isCaseSensitiveMatrix: boolean | undefined;\n  let isCaseSensitiveCell: boolean | undefined;\n\n  // let keyAudio: AudioResource | undefined = undefined;\n  // let keyImage: ImageResource | undefined = undefined;\n  // let variant: ProcessedCardVariant | undefined;\n\n  // Extract the heading card if it exists\n  const headingData = extractHeadingCard(cardSet, true);\n\n  const isDefaultExampleCardSet = headingData?.isDefaultExampleCardSet ?? false;\n  let exampleCardSet = headingData?.exampleCardSet;\n\n  for (let cardIdx = 0; cardIdx < cardSet.cards.length; cardIdx++) {\n    const card = cardSet.cards[cardIdx];\n\n    // Skip the headings card if it exists\n    if (headingData && cardIdx === 0) continue;\n\n    matrixKey = undefined;\n    matrixKeyTags = undefined;\n    // keyAudio = undefined;\n    // keyImage = undefined;\n    matrixCells = [];\n    matrixCellValues = [];\n    _matrixCellValuesAst = [];\n    isDefaultExampleCard = false;\n    exampleCard = undefined;\n    isCaseSensitiveMatrix = undefined;\n\n    for (let sideIdx = 0; sideIdx < card.sides.length; sideIdx++) {\n      const side = card.sides[sideIdx];\n\n      matrixCellValues = [];\n      _matrixCellValuesAst = [];\n      matrixCellTags = {};\n      isDefaultExampleSide = false;\n      exampleSide = undefined;\n      isCaseSensitiveCell = undefined;\n\n      for (const content of side.variants) {\n        // variant = content;\n        const tags = content.data;\n\n        const { cardBody, cardBodyStr, __isDefaultExample, example, isCaseSensitive, ...restTags } =\n          tags;\n\n        // Example\n        isDefaultExampleSide = __isDefaultExample === true ? true : isDefaultExampleSide;\n        exampleSide = example ? example : exampleSide;\n\n        // Merge the tags into the matrix cell tags\n        Object.assign(matrixCellTags, restTags);\n\n        if (sideIdx === 0) {\n          // First side (matrix)\n          matrixKey = cardBodyStr;\n          matrixKeyTags = restTags;\n          isDefaultExampleCard = __isDefaultExample === true ? true : isDefaultExampleCard;\n          exampleCard = example ? example : exampleCard;\n          isCaseSensitiveMatrix = isCaseSensitive != null ? isCaseSensitive : isCaseSensitiveMatrix;\n        } else {\n          // Subsequent sides (matrix cell value)\n          const value = cardBodyStr ?? Breakscape.EMPTY_STRING;\n          const valueAst = cardBody?.body as TextAst;\n          matrixCellValues.push(value);\n          _matrixCellValuesAst.push(valueAst);\n          if ((isDefaultExampleCardSet || isDefaultExampleSide) && !exampleSide)\n            exampleSide = valueAst;\n          isCaseSensitiveCell = isCaseSensitive != null ? isCaseSensitive : isCaseSensitiveMatrix;\n        }\n      }\n\n      // Finished looping variants, create matrix cell\n      if (sideIdx > 0) {\n        // Calculate final example and __isDefaultExample\n        if (isDefaultExampleSide) exampleCard = exampleCardSet = undefined;\n        if (isDefaultExampleCard) exampleCardSet = undefined;\n        const __isDefaultExample =\n          isDefaultExampleSide || isDefaultExampleCard || isDefaultExampleCardSet;\n        const example = exampleSide || exampleCard || exampleCardSet;\n\n        const matrixCell: Partial<MatrixCellJson> = {\n          values: matrixCellValues,\n          __valuesAst: _matrixCellValuesAst,\n          ...matrixCellTags,\n          __isDefaultExample: __isDefaultExample,\n          example,\n          isCaseSensitive: isCaseSensitiveCell,\n        };\n        if (matrixCell) matrixCells.push(matrixCell);\n      }\n    }\n\n    // if (matrixKey) {\n    const m: Partial<MatrixJson> = {\n      key: matrixKey ?? Breakscape.EMPTY_STRING,\n      // item: matrixItem ?? Breakscape.EMPTY_STRING,\n      // keyAudio,\n      // keyImage,\n      cells: matrixCells as MatrixCellJson[],\n      ...matrixKeyTags,\n    };\n    if (m) matrix.push(m);\n    // } else {\n    //   context.addWarning('Ignoring card with empty body text', variant);\n    // }\n  }\n\n  return {\n    heading: headingData?.heading,\n    matrix: matrix.length > 0 ? matrix : undefined,\n  };\n}\n\nfunction parsePronunciationTable(\n  _context: BitmarkPegParserContext,\n  _bitType: BitTypeType,\n  cardSet: ProcessedCardSet,\n): BitSpecificCards {\n  const rows: PronunciationTableCellJson[][] = [];\n  let rowValues: PronunciationTableCellJson[] = [];\n\n  for (const card of cardSet.cards) {\n    rowValues = [];\n\n    for (const side of card.sides) {\n      for (const content of side.variants) {\n        // variant = content;\n        const tags = content.data;\n\n        const { title, cardBody, resources } = tags;\n\n        const heading = title && title[1].titleAst;\n        const audio: AudioResourceWrapperJson = (\n          resources && resources.length > 0\n            ? resources.find((r) => r.type === ResourceType.audio)\n            : undefined\n        ) as AudioResourceWrapperJson;\n\n        const value: PronunciationTableCellJson = {\n          title: heading ?? [],\n          body: (cardBody?.body ?? []) as JsonText,\n          audio,\n        };\n        rowValues.push(value);\n      }\n    }\n\n    rows.push(rowValues);\n  }\n\n  const table: Partial<PronunciationTableJson> = {\n    data: rows,\n  };\n\n  return { pronunciationTable: table };\n}\n\nfunction parseTable(\n  context: BitmarkPegParserContext,\n  _bitType: BitTypeType,\n  cardSet: ProcessedCardSet,\n): BitSpecificCards {\n  type TableSectionKey = 'header' | 'body' | 'footer';\n\n  const sectionRows: Record<TableSectionKey, TableRowJson[]> = {\n    header: [],\n    body: [],\n    footer: [],\n  };\n\n  const getNormalizedQualifier = (\n    rawQualifier: string | undefined,\n  ): TableSectionKey | undefined => {\n    if (!rawQualifier) return undefined;\n    const normalized = rawQualifier.trim().toLowerCase();\n    if (normalized === 'table-header') return 'header';\n    if (normalized === 'table-body') return 'body';\n    if (normalized === 'table-footer') return 'footer';\n\n    context.addWarning(`Unknown table section qualifier '${rawQualifier}', defaulting to body.`);\n    return undefined;\n  };\n\n  const isLegacyHeadingRow = (card: ProcessedCard, cardIndex: number): boolean => {\n    if (cardIndex !== 0) return false;\n    return card.sides.some((side) =>\n      side.variants.some((variant) => {\n        const titles = variant.data.title;\n        return Array.isArray(titles) && titles[1]?.titleAst;\n      }),\n    );\n  };\n\n  const readExtraProperty = (extra: ExtraProperties | undefined, key: string): unknown => {\n    if (!extra) return undefined;\n    const value = extra[key];\n    return Array.isArray(value) ? value[0] : value;\n  };\n\n  const cleanupExtraProperties = (tags: BitContentProcessorResult, keys: string[]) => {\n    const extra = tags.extraProperties;\n    if (!extra) return;\n\n    for (const key of keys) {\n      if (Object.prototype.hasOwnProperty.call(extra, key)) delete extra[key];\n    }\n\n    if (Object.keys(extra).length === 0) {\n      delete tags.extraProperties;\n    }\n  };\n\n  const normalizeCellType = (raw: unknown, section: TableSectionKey): 'th' | 'td' => {\n    if (typeof raw === 'string') {\n      const normalized = raw.trim().toLowerCase();\n      if (normalized === 'th' || normalized === 'td') {\n        return normalized;\n      }\n      context.addWarning(\n        `Invalid table cell type '${raw}', using default for section '${section}'.`,\n      );\n    }\n\n    return section === 'body' ? 'td' : 'th';\n  };\n\n  const normalizeSpan = (raw: unknown, kind: 'rowspan' | 'colspan'): number => {\n    if (raw == null) return 1;\n\n    const numeric = NumberUtils.asNumber(raw);\n    if (numeric == null || !Number.isInteger(numeric) || numeric < 1) {\n      context.addWarning(`Invalid table ${kind} '${raw}', defaulting to 1.`);\n      return 1;\n    }\n\n    return numeric;\n  };\n\n  const normalizeScope = (raw: unknown): TableCellJson['scope'] | undefined => {\n    if (raw == null) return undefined;\n\n    if (typeof raw !== 'string') {\n      context.addWarning(`Invalid table scope '${raw}', ignoring.`);\n      return undefined;\n    }\n\n    const normalized = raw.trim().toLowerCase();\n    switch (normalized) {\n      case 'row':\n      case 'col':\n      case 'rowgroup':\n      case 'colgroup':\n        return normalized;\n      default:\n        context.addWarning(`Invalid table scope '${raw}', ignoring.`);\n        return undefined;\n    }\n  };\n\n  const buildCell = (variant: ProcessedCardVariant, section: TableSectionKey): TableCellJson => {\n    const tags = variant.data;\n\n    const heading = tags.title && tags.title[1]?.titleAst;\n    const bodyContent =\n      (tags.cardBody?.body as JsonText | undefined) ?? tags.cardBodyStr ?? Breakscape.EMPTY_STRING;\n    const content: JsonText = heading ?? bodyContent;\n\n    const cellTypeRaw =\n      tags.tableCellType ?? readExtraProperty(tags.extraProperties, 'tableCellType');\n    const rowSpanRaw = tags.tableRowSpan ?? readExtraProperty(tags.extraProperties, 'tableRowSpan');\n    const colSpanRaw = tags.tableColSpan ?? readExtraProperty(tags.extraProperties, 'tableColSpan');\n    const scopeRaw = tags.tableScope ?? readExtraProperty(tags.extraProperties, 'tableScope');\n    const colWidthRaw =\n      tags.tableColWidth ?? readExtraProperty(tags.extraProperties, 'tableColWidth');\n\n    cleanupExtraProperties(tags, [\n      'tableCellType',\n      'tableRowSpan',\n      'tableColSpan',\n      'tableScope',\n      'tableColWidth',\n    ]);\n\n    const cellType = normalizeCellType(cellTypeRaw, section);\n    const rowspan = normalizeSpan(rowSpanRaw, 'rowspan');\n    const colspan = normalizeSpan(colSpanRaw, 'colspan');\n    const scope = normalizeScope(scopeRaw);\n    const colwidth = NumberUtils.asNumber(colWidthRaw) ?? 0;\n\n    const cell: TableCellJson = {\n      content,\n    };\n\n    if (cellType === 'th') cell.title = true;\n    if (rowspan > 1) cell.rowspan = rowspan;\n    if (colspan > 1) cell.colspan = colspan;\n    if (scope) cell.scope = scope;\n    if (colwidth > 0) cell.colwidth = colwidth;\n\n    return cell;\n  };\n\n  const resolveSectionQualifier = (card: ProcessedCard): TableSectionKey | undefined => {\n    const cardQualifier = getNormalizedQualifier(card.qualifier);\n    if (cardQualifier) return cardQualifier;\n\n    for (const side of card.sides) {\n      const sideQualifier = getNormalizedQualifier(side.qualifier);\n      if (sideQualifier) return sideQualifier;\n\n      for (const variant of side.variants) {\n        const variantQualifier = getNormalizedQualifier(variant.qualifier);\n        if (variantQualifier) return variantQualifier;\n      }\n    }\n\n    return undefined;\n  };\n\n  for (let cardIdx = 0; cardIdx < cardSet.cards.length; cardIdx++) {\n    const card = cardSet.cards[cardIdx];\n\n    const qualifier = resolveSectionQualifier(card);\n    const section: TableSectionKey = qualifier\n      ? qualifier\n      : isLegacyHeadingRow(card, cardIdx)\n        ? 'header'\n        : 'body';\n\n    const cells: TableCellJson[] = [];\n    for (const side of card.sides) {\n      for (const variant of side.variants) {\n        cells.push(buildCell(variant, section));\n      }\n    }\n\n    sectionRows[section].push({\n      cells,\n    });\n  }\n\n  const table: Partial<TableExtendedJson> = {};\n\n  const hasHeadRows = sectionRows.header.length > 0;\n  const hasBodyRows = sectionRows.body.length > 0;\n  const hasFootRows = sectionRows.footer.length > 0;\n\n  if (hasHeadRows) {\n    table.header = {\n      rows: sectionRows.header,\n    };\n  }\n\n  if (hasBodyRows) {\n    table.body = {\n      rows: sectionRows.body,\n    };\n  }\n\n  if (hasFootRows) {\n    table.footer = {\n      rows: sectionRows.footer,\n    };\n  }\n\n  if (!hasHeadRows && !hasBodyRows && !hasFootRows) {\n    table.header = { rows: [] };\n    table.body = { rows: [] };\n    table.footer = { rows: [] };\n  }\n\n  return { table };\n}\n\nfunction parseBotActionResponses(\n  _context: BitmarkPegParserContext,\n  _bitType: BitTypeType,\n  cardSet: ProcessedCardSet,\n): BitSpecificCards {\n  const botResponses: Partial<BotResponseJson>[] = [];\n\n  for (const card of cardSet.cards) {\n    for (const side of card.sides) {\n      for (const content of side.variants) {\n        const {\n          __instructionString,\n          __itemString,\n          reaction,\n          cardBodyStr: feedback,\n          ...tags\n        } = content.data;\n\n        const botResponse: Partial<BotResponseJson> = {\n          response: __instructionString ?? Breakscape.EMPTY_STRING,\n          reaction: reaction ?? Breakscape.EMPTY_STRING,\n          feedback: feedback ?? Breakscape.EMPTY_STRING,\n          ...tags,\n          item: __itemString ?? Breakscape.EMPTY_STRING,\n        };\n        if (botResponse) botResponses.push(botResponse);\n      }\n    }\n  }\n\n  return {\n    botResponses: botResponses.length > 0 ? botResponses : undefined,\n  };\n}\n\nfunction parseIngredients(\n  _context: BitmarkPegParserContext,\n  _bitType: BitTypeType,\n  cardSet: ProcessedCardSet,\n): BitSpecificCards {\n  const ingredients: Partial<IngredientJson>[] = [];\n\n  for (const card of cardSet.cards) {\n    for (const side of card.sides) {\n      for (const content of side.variants) {\n        const {\n          title: titleArray,\n          __instructionString,\n          unit,\n          unitPlural,\n          unitAbbr,\n          unitAbbrPlural,\n          decimalPlaces,\n          disableCalculation,\n          cardBodyStr,\n          cardBody,\n          ...tags\n        } = content.data;\n\n        // Extract 'title' from title array (if present)\n        // Extract 'quantity' from either then unchained instruction, or from the select (otherwise use 0)\n        // Extract checked from the select options (if present, otherwise checked is false))\n        const title =\n          Array.isArray(titleArray) && titleArray.length > 0\n            ? titleArray[titleArray.length - 1].titleString\n            : undefined;\n        let checked = false;\n        let quantity: number | undefined = NumberUtils.asNumber(__instructionString);\n        if (cardBody && cardBody.bodyBits) {\n          const select: SelectJson | undefined = cardBody.bodyBits.find(\n            (c) => c.type === BodyBitType.select,\n          ) as SelectJson | undefined;\n          if (select) {\n            quantity = select.__instructionString\n              ? NumberUtils.asNumber(select.__instructionString)\n              : quantity;\n            if (select.options && select.options.length > 0) {\n              checked = select.options[0].isCorrect;\n            }\n          }\n        }\n\n        const ingredient: Partial<IngredientJson> = {\n          title,\n          checked,\n          // TS compiler very weird. It doesn't recognize that cardBodyStr is a string|undefined, even if cast!\n          // Casting to 'any' to avoid the error\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          ingredient: cardBodyStr as any,\n          quantity,\n          unit: unit ?? Breakscape.EMPTY_STRING,\n          unitPlural,\n          unitAbbr: unitAbbr ?? Breakscape.EMPTY_STRING,\n          unitAbbrPlural,\n          decimalPlaces: decimalPlaces ?? 1,\n          disableCalculation: disableCalculation,\n          ...tags,\n        };\n        if (ingredient) ingredients.push(ingredient);\n      }\n    }\n  }\n\n  return {\n    ingredients: ingredients.length > 0 ? ingredients : undefined,\n  };\n}\n\n// DEPRECATED - REMOVE IN THE FUTURE\n// function parseCaptionDefinitionsList(\n//   _context: BitmarkPegParserContext,\n//   _bitType: BitTypeType,\n//   cardSet: ProcessedCardSet,\n// ): BitSpecificCards {\n//   let isHeading = false;\n//   const columns: string[] = [];\n//   const rows: string[][] = [];\n//   let rowValues: string[] = [];\n\n//   for (let cardIdx = 0; cardIdx < cardSet.cards.length; cardIdx++) {\n//     const card = cardSet.cards[cardIdx];\n\n//     isHeading = false;\n//     rowValues = [];\n\n//     for (const side of card.sides) {\n//       for (const content of side.variants) {\n//         // variant = content;\n//         const tags = content.data;\n\n//         const { title, cardBodyStr } = tags;\n\n//         // Get the 'heading' which is the [#title] at level 1\n//         const heading = title && title[1].titleString;\n//         if (cardIdx === 0 && heading != null) isHeading = true;\n\n//         if (isHeading) {\n//           columns.push(heading ?? '');\n//         } else {\n//           // If not a heading, it is a row cell value\n//           const value = cardBodyStr ?? '';\n//           rowValues.push(value);\n//         }\n//       }\n//     }\n\n//     if (!isHeading) {\n//       rows.push(rowValues);\n//     }\n//   }\n\n//   const captionDefinitionList: Partial<CaptionDefinitionListJson> | undefined =\n//     columns.length > 0\n//       ? {\n//           heading: columns,\n//           definitions: rows\n//             .map((row) => {\n//               const col: Partial<CaptionDefinitionJson> = {\n//                 term: row[0],\n//                 definition: row[1],\n//               };\n//               return col as CaptionDefinitionJson;\n//             })\n//             .filter((d) => d != null),\n//         }\n//       : undefined;\n\n//   return { captionDefinitionList };\n// }\n\nfunction parseCardBits(\n  _context: BitmarkPegParserContext,\n  _bitType: BitTypeType,\n  _textFormat: TextFormatType,\n  cardSet: ProcessedCardSet,\n): BitSpecificCards {\n  const cardBits: Partial<CardBit>[] = [];\n\n  for (const card of cardSet.cards) {\n    for (const side of card.sides) {\n      for (const content of side.variants) {\n        const { cardBody: body, ...rest } = content.data;\n\n        const cardBit: Partial<CardBit> = {\n          body,\n          ...rest,\n        } as CardBit;\n        if (cardBit) cardBits.push(cardBit);\n      }\n    }\n  }\n\n  return {\n    cardBits: cardBits.length > 0 ? cardBits : undefined,\n  };\n}\n\nfunction extractHeadingCard(\n  cardSet: ProcessedCardSet,\n  valuesIsArray = false,\n): HeadingData | undefined {\n  let isHeading = false;\n  let heading: Partial<HeadingJson> | undefined;\n  let forKeys: string | undefined = undefined;\n  const forValues: string[] = [];\n  let isDefaultExampleCardSet = false;\n  let exampleCardSet: ExampleJson | undefined;\n\n  if (cardSet.cards.length === 0) return undefined;\n  const card = cardSet.cards[0];\n\n  for (let sideIdx = 0; sideIdx < card.sides.length; sideIdx++) {\n    const side = card.sides[sideIdx];\n\n    if (side.variants.length === 0) continue;\n\n    const content = side.variants[0];\n    const tags = content.data;\n\n    const { title, __isDefaultExample, example } = tags;\n\n    // Get the 'heading' which is the [#title] at level 1\n    const heading = title && title[1].titleString;\n    if (heading != null) isHeading = true;\n\n    if (sideIdx === 0) {\n      // 1st side\n\n      if (isHeading) {\n        forKeys = heading;\n        isDefaultExampleCardSet = __isDefaultExample === true ? true : isDefaultExampleCardSet;\n        exampleCardSet = example ? (example as TextAst) : exampleCardSet;\n      }\n    } /*if (sideIdx === 1)*/ else {\n      // 2nd side\n      if (isHeading) {\n        forValues.push(heading ?? '');\n        isDefaultExampleCardSet = __isDefaultExample === true ? true : isDefaultExampleCardSet;\n        exampleCardSet = example ? (example as TextAst) : exampleCardSet;\n      }\n    }\n  }\n\n  if (isHeading) {\n    let forValuesFinal: string | string[] = forValues;\n    if (valuesIsArray) {\n      // forValues is an array of values\n      forValuesFinal = forValues;\n    } else {\n      // Standard match, forValues is a single value\n      if (forValues.length >= 1) {\n        forValuesFinal = forValues[forValues.length - 1];\n      } else {\n        forValuesFinal = '';\n      }\n    }\n\n    heading = {\n      forKeys: forKeys ?? '',\n      forValues: forValuesFinal,\n    };\n  }\n\n  return heading\n    ? {\n        heading: heading as HeadingJson,\n        isDefaultExampleCardSet,\n        exampleCardSet,\n      }\n    : undefined;\n}\n\nexport { buildCards };\n","import { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport { TextParser } from '../../../text/TextParser.ts';\nimport {\n  type BitContent,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  TypeKey,\n  type TypeValue,\n} from '../BitmarkPegParserTypes.ts';\n\nfunction defaultTagContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  _tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { type, value } = content as TypeValue;\n  const { textFormat } = context;\n  const textParser = new TextParser();\n\n  const trimmedStringValue = StringUtils.trimmedString(value) as BreakscapedString;\n\n  switch (type) {\n    case TypeKey.Instruction: {\n      target.instruction = textParser.toAst(trimmedStringValue, {\n        format: textFormat,\n        location: TextLocation.tag,\n      });\n      target.__instructionString = Breakscape.unbreakscape(trimmedStringValue, {\n        format: TextFormat.bitmarkText,\n        location: TextLocation.tag,\n      });\n      break;\n    }\n\n    case TypeKey.Hint: {\n      target.hint = textParser.toAst(trimmedStringValue, {\n        format: textFormat,\n        location: TextLocation.tag,\n      });\n      target.__hintString = Breakscape.unbreakscape(trimmedStringValue, {\n        format: TextFormat.bitmarkText,\n        location: TextLocation.tag,\n      });\n      break;\n    }\n\n    case TypeKey.Anchor: {\n      target.anchor = Breakscape.unbreakscape(trimmedStringValue, {\n        format: TextFormat.bitmarkText,\n        location: TextLocation.tag,\n      });\n      break;\n    }\n\n    case TypeKey.Reference: {\n      target.reference = Breakscape.unbreakscape(trimmedStringValue, {\n        format: TextFormat.bitmarkText,\n        location: TextLocation.tag,\n      });\n      break;\n    }\n\n    // 16.08.2023 Deprecated, but currently still supported\n    case TypeKey.SampleSolution: {\n      target.sampleSolution = Breakscape.unbreakscape(trimmedStringValue, {\n        format: TextFormat.bitmarkText,\n        location: TextLocation.tag,\n      });\n      target.__sampleSolutionAst = textParser.toAst(trimmedStringValue, {\n        format: textFormat,\n        location: TextLocation.tag,\n      });\n      context.addWarning('[$...] tag is deprecated, use [@sampleSolution:...] instead', content);\n      break;\n    }\n\n    default:\n    // Unknown tag\n  }\n}\nexport { defaultTagContentProcessor };\n","import { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { type Footer } from '../../../../model/ast/Nodes.ts';\nimport { type JsonText } from '../../../../model/ast/TextNodes.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport { TextParser } from '../../../text/TextParser.ts';\nimport {\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n} from '../BitmarkPegParserTypes.ts';\nimport { BitmarkPegParserValidator } from '../BitmarkPegParserValidator.ts';\nimport { ContentProcessorUtils } from './ContentProcessorUtils.ts';\n\nexport interface FooterText {\n  footerText: BreakscapedString;\n  isPlain: boolean;\n}\n\nconst textParser = new TextParser();\n\nclass FooterContentProcessor {\n  public process(\n    context: BitmarkPegParserContext,\n    contentDepth: ContentDepthType,\n    _tagsConfig: TagsConfig | undefined,\n    _target: BitContentProcessorResult,\n    footer: BreakscapedString,\n    footerPlainText: BreakscapedString,\n  ): Footer | undefined {\n    const { textFormat } = context;\n    let finalFooterText: JsonText | undefined;\n\n    footer = footer.trimStart() as BreakscapedString;\n    footerPlainText = footerPlainText.trimEnd() as BreakscapedString;\n\n    // Create the body text AST\n    const haveFooter = !!footer.trim();\n    const haveFooterPlainText = !!footerPlainText.trim();\n\n    // Newlines will be lost from the end of footer, and start of footerPlainText\n    // Count then and add them back when merging\n    let newLines = 0;\n    if (haveFooter && haveFooterPlainText) {\n      newLines =\n        StringUtils.countOccurrencesAtEnd(footer, '\\n') +\n        StringUtils.countOccurrencesAtStart(footerPlainText, '\\n');\n    }\n\n    if (footer || footerPlainText) {\n      const isBitmarkText = textFormat === TextFormat.bitmarkText;\n\n      if (footer) {\n        footer = BitmarkPegParserValidator.checkFooter(context, contentDepth, footer);\n      }\n\n      const parsedFooterText: JsonText = isBitmarkText\n        ? textParser.toAst(footer, {\n            //\n            format: textFormat,\n            location: TextLocation.body,\n          })\n        : Breakscape.unbreakscape(footer, {\n            format: TextFormat.plainText,\n            location: TextLocation.body,\n          });\n\n      const parsedFooterPlainText = Breakscape.unbreakscape(footerPlainText, {\n        format: TextFormat.plainText,\n        location: TextLocation.body,\n      });\n\n      finalFooterText = ContentProcessorUtils.concatenatePlainTextWithAstTexts(\n        parsedFooterText,\n        newLines,\n        parsedFooterPlainText,\n      );\n    }\n\n    // Return the footer in the target\n    return finalFooterText ? { footer: finalFooterText } : undefined;\n  }\n}\n\nconst instance = new FooterContentProcessor();\nexport { instance as FooterContentProcessor };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { Config } from '../../../../config/Config.ts';\nimport { type BodyPart } from '../../../../model/ast/Nodes.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { BodyBitType } from '../../../../model/enum/BodyBitType.ts';\nimport { Tag } from '../../../../model/enum/Tag.ts';\nimport { type GapJson } from '../../../../model/json/BodyBitJson.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n} from '../BitmarkPegParserTypes.ts';\nimport { clozeTagContentProcessor } from './ClozeTagContentProcessor.ts';\n\nfunction gapChainContentProcessor(\n  context: BitmarkPegParserContext,\n  contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n  bodyParts: BodyPart[],\n): void {\n  if (contentDepth === BitContentLevel.Chain) {\n    clozeTagContentProcessor(context, contentDepth, tagsConfig, content, target);\n  } else {\n    const gap: Partial<GapJson> | undefined = buildGap(context, contentDepth, tagsConfig, content);\n    if (gap) bodyParts.push(gap as BodyPart);\n  }\n}\n\nfunction buildGap(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n): Partial<GapJson> | undefined {\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('gap content', content);\n\n  const gapConfig = Config.getTagConfigForTag(tagsConfig, Enum(Tag).fromValue(content.type));\n\n  const chainContent = [content, ...(content.chain ?? [])];\n\n  const chainTags = context.bitContentProcessor(\n    BitContentLevel.Chain,\n    gapConfig?.chain,\n    chainContent,\n  );\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('gap TAGS', chainTags);\n\n  const gap: Partial<GapJson> = {\n    type: BodyBitType.gap,\n    ...chainTags,\n  };\n\n  return gap;\n}\n\nexport { gapChainContentProcessor };\n","import { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport { TextParser } from '../../../text/TextParser.ts';\nimport {\n  type BitContent,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type TypeValue,\n} from '../BitmarkPegParserTypes.ts';\n\nconst textParser = new TextParser();\n\nfunction clozeTagContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  _tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { textFormat } = context;\n  const { value } = content as TypeValue;\n\n  const solutions = target.solutions;\n  const solutionsAst = target.__solutionsAst;\n\n  if (!solutions || !solutionsAst) return;\n\n  if (StringUtils.isString(value)) {\n    const trimmedStringValue = StringUtils.trimmedString(value) as BreakscapedString;\n\n    solutions.push(\n      Breakscape.unbreakscape(trimmedStringValue, {\n        format: TextFormat.bitmarkText,\n        location: TextLocation.tag,\n      }),\n    );\n\n    const solutionAst = textParser.toAst(trimmedStringValue, {\n      format: textFormat,\n      location: TextLocation.tag,\n    });\n    solutionsAst.push(solutionAst);\n  }\n}\nexport { clozeTagContentProcessor };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { Config } from '../../../../config/Config.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { Tag } from '../../../../model/enum/Tag.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n} from '../BitmarkPegParserTypes.ts';\nimport { itemLeadTagContentProcessor } from './ItemLeadTagContentProcessor.ts';\n\n/**\n * Recursively flatten nested chain content into a flat array.\n * Handles both flat chains (old config) and nested sub-chains (new config).\n */\nfunction flattenChainContent(content: BitContent): BitContent[] {\n  const result: BitContent[] = [content];\n  if (content.chain) {\n    for (const child of content.chain) {\n      result.push(...flattenChainContent(child));\n    }\n  }\n  return result;\n}\n\nfunction itemLeadChainContentProcessor(\n  context: BitmarkPegParserContext,\n  contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  if (contentDepth === BitContentLevel.Chain) {\n    itemLeadTagContentProcessor(context, contentDepth, tagsConfig, content, target);\n  } else {\n    buildItemLead(context, contentDepth, tagsConfig, content, target);\n  }\n}\n\nfunction buildItemLead(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('item lead content', content);\n\n  // Process the chain (lead)\n  const itemLeadConfig = Config.getTagConfigForTag(tagsConfig, Enum(Tag).fromValue(content.type));\n  const chainContent = flattenChainContent(content);\n\n  const chainTags = context.bitContentProcessor(\n    BitContentLevel.Chain,\n    itemLeadConfig?.chain,\n    chainContent,\n  );\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('item lead TAGS', chainTags);\n\n  // Set the lead item from the chain\n  target.itemLead = chainTags.itemLead;\n  target.__itemLeadString = chainTags.__itemLeadString;\n}\n\nexport { itemLeadChainContentProcessor };\n","import { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport { TextParser } from '../../../text/TextParser.ts';\nimport {\n  type BitContent,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type TypeValue,\n} from '../BitmarkPegParserTypes.ts';\n\nfunction itemLeadTagContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  _tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { textFormat } = context;\n  const { value } = content as TypeValue;\n  const textParser = new TextParser();\n\n  const trimmedStringValue = StringUtils.trimmedString(value) as BreakscapedString;\n\n  if (!target.itemLead) target.itemLead = [];\n  const text = textParser.toAst(trimmedStringValue, {\n    format: textFormat,\n    location: TextLocation.tag,\n  });\n  target.itemLead.push(text);\n\n  if (!target.__itemLeadString) target.__itemLeadString = [];\n  target.__itemLeadString.push(\n    Breakscape.unbreakscape(trimmedStringValue, {\n      format: TextFormat.bitmarkText,\n      location: TextLocation.tag,\n    }),\n  );\n}\nexport { itemLeadTagContentProcessor };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { Config } from '../../../../config/Config.ts';\nimport { type BodyPart } from '../../../../model/ast/Nodes.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { BodyBitType } from '../../../../model/enum/BodyBitType.ts';\nimport { Tag } from '../../../../model/enum/Tag.ts';\nimport { type MarkJson } from '../../../../model/json/BodyBitJson.ts';\nimport { ArrayUtils } from '../../../../utils/ArrayUtils.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n} from '../BitmarkPegParserTypes.ts';\nimport { markTagContentProcessor } from './MarkTagContentProcessor.ts';\n\nfunction markChainContentProcessor(\n  context: BitmarkPegParserContext,\n  contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n  bodyParts: BodyPart[],\n): void {\n  if (contentDepth === BitContentLevel.Chain) {\n    markTagContentProcessor(context, BitContentLevel.Chain, content, target);\n  } else {\n    const mark: Partial<MarkJson> | undefined = buildMark(\n      context,\n      contentDepth,\n      tagsConfig,\n      content,\n    );\n    if (mark) bodyParts.push(mark as BodyPart);\n  }\n}\n\nfunction buildMark(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n): Partial<MarkJson> | undefined {\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('mark content', content);\n\n  const markConfig = Config.getTagConfigForTag(tagsConfig, Enum(Tag).fromValue(content.type));\n\n  const tags = context.bitContentProcessor(BitContentLevel.Chain, tagsConfig, [content]);\n  const chainTags = context.bitContentProcessor(\n    BitContentLevel.Chain,\n    markConfig?.chain,\n    content.chain,\n  );\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('mark TAGS', chainTags);\n\n  const { solution } = tags;\n  const { mark: markType, ...rest } = chainTags;\n\n  const mark: Partial<MarkJson> = {\n    type: BodyBitType.mark,\n    solution: solution ?? '',\n    mark: ArrayUtils.asSingle(markType) ?? '',\n    ...rest,\n  };\n\n  return mark;\n}\n\nexport { markChainContentProcessor };\n","import { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport {\n  type BitContent,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type TypeValue,\n} from '../BitmarkPegParserTypes.ts';\n\nfunction markTagContentProcessor(\n  _context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { value } = content as TypeValue;\n\n  if (StringUtils.isString(value)) {\n    target.solution = StringUtils.trimmedString(value) as BreakscapedString;\n  }\n}\nexport { markTagContentProcessor };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { Config } from '../../../../config/Config.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { ConfigKey, configKeyToPropertyType } from '../../../../model/config/enum/ConfigKey.ts';\nimport { PropertyTagConfig } from '../../../../model/config/PropertyTagConfig.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { PropertyKey } from '../../../../model/enum/PropertyKey.ts';\nimport { TagFormat } from '../../../../model/enum/TagFormat.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { BooleanUtils } from '../../../../utils/BooleanUtils.ts';\nimport { NumberUtils } from '../../../../utils/NumberUtils.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport { TextParser } from '../../../text/TextParser.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type TypeKeyValue,\n} from '../BitmarkPegParserTypes.ts';\nimport { bookChainContentProcessor } from './BookChainContentProcessor.ts';\nimport { exampleTagContentProcessor } from './ExampleTagContentProcessor.ts';\nimport { groupTagChainContentProcessor } from './GroupTagChainContentProcessor.ts';\nimport { imageSourceChainContentProcessor } from './ImageSourceChainContentProcessor.ts';\nimport { commentTagContentProcessor as internalCommentTagContentProcessor } from './InternalCommentTagContentProcessor.ts';\nimport { markConfigChainContentProcessor } from './MarkConfigChainContentProcessor.ts';\nimport { personChainContentProcessor } from './PersonChainContentProcessor.ts';\nimport { ratingLevelChainContentProcessor } from './RatingLevelChainContentProcessor.ts';\nimport { servingsChainContentProcessor } from './ServingsChainContentProcessor.ts';\nimport { technicalTermChainContentProcessor } from './TechnicalTermChainContentProcessor.ts';\n\nconst textParser = new TextParser();\n\nfunction propertyContentProcessor(\n  context: BitmarkPegParserContext,\n  contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { value } = content as TypeKeyValue;\n  const { key: keyIn } = content as TypeKeyValue;\n  const isChain = contentDepth === BitContentLevel.Chain;\n\n  // Get the property config for the tag (if it exists)\n  const propertyConfig = Config.getTagConfigForTag(tagsConfig, Enum(PropertyKey).fromValue(keyIn));\n  const configKey = propertyConfig ? propertyConfig.configKey : undefined;\n  let property = configKeyToPropertyType(keyIn);\n\n  // Handle internal comments\n  if (configKey === ConfigKey.property_internalComment) {\n    internalCommentTagContentProcessor(context, contentDepth, content, target);\n    return;\n  }\n\n  // Check for chains\n  // Generally, the chain will only be present in the correct bit as the data was already validated. The bit type\n  // should also be checked here if the property may occur in another bit with a different meaning.\n  if (propertyConfig) {\n    if (configKey === ConfigKey.property_example) {\n      exampleTagContentProcessor(context, contentDepth, content, target);\n      return;\n    } else if (configKey === ConfigKey.property_groupTag) {\n      groupTagChainContentProcessor(context, contentDepth, propertyConfig.chain, content, target);\n      return;\n    } else if (\n      configKey === ConfigKey.property_ratingLevelStart ||\n      configKey === ConfigKey.property_ratingLevelEnd\n    ) {\n      ratingLevelChainContentProcessor(\n        context,\n        contentDepth,\n        propertyConfig.chain,\n        content,\n        target,\n      );\n      return;\n    } else if (configKey === ConfigKey.property_technicalTerm) {\n      technicalTermChainContentProcessor(\n        context,\n        contentDepth,\n        propertyConfig.chain,\n        content,\n        target,\n      );\n      return;\n    } else if (configKey === ConfigKey.property_servings) {\n      servingsChainContentProcessor(context, contentDepth, propertyConfig.chain, content, target);\n      return;\n    } else if (\n      configKey === ConfigKey.property_person ||\n      configKey === ConfigKey.property_partner\n    ) {\n      personChainContentProcessor(context, contentDepth, propertyConfig.chain, content, target);\n      return;\n    } else if (configKey === ConfigKey.property_imageSource) {\n      imageSourceChainContentProcessor(context, contentDepth, tagsConfig, content, target);\n      return;\n    } else if (configKey === ConfigKey.property_book) {\n      bookChainContentProcessor(context, contentDepth, propertyConfig.chain, content, target);\n      return;\n    } else if (configKey === ConfigKey.property_mark && !isChain) {\n      markConfigChainContentProcessor(context, contentDepth, tagsConfig, content, target);\n      return;\n    } else if (configKey === ConfigKey.property_title && isChain) {\n      // Hack the intermediate tag so as not to clash with [#title] tags which are not chained (yet)\n      property = 'propertyTitle';\n    }\n  }\n\n  // Helper for building the properties\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const addProperty = (obj: any, tag: string, v: unknown, c: PropertyTagConfig | undefined) => {\n    // if (key === 'progress') debugger;\n\n    // Convert property as needed\n    const processValue = (v: unknown) => {\n      if (v == null) return undefined;\n\n      if (c) {\n        switch (c.format) {\n          // case PropertyFormat.string:\n          //   return StringUtils.isString(v) ? StringUtils.string(v) : undefined;\n\n          case TagFormat.plainText:\n            return Breakscape.unbreakscape(\n              StringUtils.isString(v)\n                ? (StringUtils.trimmedString(v) as BreakscapedString)\n                : undefined,\n              {\n                format: TextFormat.plainText,\n                location: TextLocation.tag,\n              },\n            );\n\n          case TagFormat.number:\n            return NumberUtils.asNumber(\n              Breakscape.unbreakscape(v as BreakscapedString, {\n                format: TextFormat.plainText,\n                location: TextLocation.tag,\n              }),\n            );\n\n          case TagFormat.boolean:\n            return BooleanUtils.toBoolean(\n              Breakscape.unbreakscape(v as BreakscapedString, {\n                format: TextFormat.plainText,\n                location: TextLocation.tag,\n              }),\n              true,\n            );\n\n          case TagFormat.invertedBoolean:\n            return !BooleanUtils.toBoolean(\n              Breakscape.unbreakscape(v as BreakscapedString, {\n                format: TextFormat.plainText,\n                location: TextLocation.tag,\n              }),\n              true,\n            );\n\n          case TagFormat.bitmarkText:\n            v = StringUtils.isString(v) ? v : '';\n            return textParser.toAst(v as BreakscapedString, {\n              format: TextFormat.bitmarkText,\n              location: TextLocation.tag,\n            });\n\n          case TagFormat.coordinates:\n            const coordRaw = Breakscape.unbreakscape(v as BreakscapedString, {\n              format: TextFormat.plainText,\n              location: TextLocation.tag,\n            });\n            if (coordRaw == null) return undefined;\n\n            const coordParts = coordRaw.split(',').map((p) => NumberUtils.asNumber(p.trim()));\n            if (coordParts.length !== 4 || coordParts.some((n) => n == null)) {\n              return undefined;\n            }\n            return coordParts as number[];\n        }\n      }\n      return Breakscape.unbreakscape(v as BreakscapedString, {\n        format: TextFormat.plainText,\n        location: TextLocation.tag,\n      });\n    };\n\n    // Convert property and key as needed\n    v = processValue(v);\n\n    if (c == null || c.array) {\n      if (Object.prototype.hasOwnProperty.call(obj, tag)) {\n        const originalValue = obj[tag];\n        obj[tag] = [...originalValue, v];\n      } else {\n        obj[tag] = [v];\n      }\n    } else {\n      obj[tag] = v;\n    }\n  };\n\n  if (propertyConfig) {\n    // Known property in correct position\n    addProperty(target, property, value, propertyConfig);\n  } else {\n    // Unknown (extra) property\n    addProperty(target.extraProperties, property, value, propertyConfig);\n  }\n\n  // HACKS: Need to allow properties for different bits and in chains to have different/multiple formats!\n  // This is not currently supported by the config system; it would need to be extended to support this.\n  // That is a big job, so instead there are just some hacks here for the few cases where it is currently needed :(\n  if (configKey === ConfigKey.property_sampleSolution) {\n    addProperty(\n      target,\n      '__sampleSolutionAst',\n      value,\n      new PropertyTagConfig({\n        configKey: ConfigKey.property_sampleSolution,\n        tag: 'sampleSolution',\n        maxCount: 1,\n        minCount: 1,\n        chain: undefined,\n        jsonKey: undefined,\n        exportJsonKey: undefined,\n        hasExportJsonKey: false,\n        htmlKey: undefined,\n        hasHtmlKey: false,\n        format: TagFormat.bitmarkText,\n        values: undefined,\n        defaultValue: undefined,\n        deprecated: undefined,\n      }),\n    );\n  }\n}\n\nexport { propertyContentProcessor };\n","import { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { ConfigKey } from '../../../../model/config/enum/ConfigKey.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { Count } from '../../../../model/enum/Count.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n} from '../BitmarkPegParserTypes.ts';\n\nfunction bookChainContentProcessor(\n  context: BitmarkPegParserContext,\n  contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  if (contentDepth === BitContentLevel.Chain) {\n    // Do nothing\n  } else {\n    buildBook(context, contentDepth, tagsConfig, content, target);\n  }\n}\n\nfunction buildBook(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { bitConfig } = context;\n\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('book content', content);\n\n  const tags = context.bitContentProcessor(BitContentLevel.Chain, tagsConfig, content.chain);\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('book TAGS', tags);\n\n  const { reference, referenceEnd } = tags;\n\n  // Extract the book from the content tag\n  const book = Breakscape.unbreakscape(\n    StringUtils.trimmedString(content.value) as BreakscapedString,\n    {\n      format: TextFormat.bitmarkText,\n      location: TextLocation.tag,\n    },\n  );\n\n  // Get the config for the bit\n  const bookConfig = bitConfig.tags[ConfigKey.property_book];\n  if (bookConfig && (bookConfig.maxCount === Count.infinity || bookConfig.maxCount > 1)) {\n    // Add the book to the list of books\n    if (!Array.isArray(target.book)) target.book = [];\n    target.book.push({\n      book,\n      reference: reference ?? '',\n      referenceEnd: (referenceEnd ?? undefined) as string,\n    });\n    return;\n  }\n\n  // Book should be added at the body level\n  target.book = book;\n  target.reference = reference;\n  target.referenceEnd = referenceEnd;\n}\n\nexport { bookChainContentProcessor };\n","import { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { Config } from '../../../../config/Config.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { BitType } from '../../../../model/enum/BitType.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { BooleanUtils } from '../../../../utils/BooleanUtils.ts';\nimport { TextParser } from '../../../text/TextParser.ts';\nimport {\n  type BitContent,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type TrueFalseValue,\n  type TypeValue,\n} from '../BitmarkPegParserTypes.ts';\n\n// const builder = new Builder();\nconst textParser = new TextParser();\n\nfunction exampleTagContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { bitType } = context;\n  const { value } = content as TypeValue;\n  const example = value as BreakscapedString | boolean;\n\n  // Each bit type handles example tags differently\n  if (\n    Config.isOfBitType(bitType, [\n      BitType.cloze,\n      BitType.clozeAndMultipleChoiceText,\n      BitType.multipleChoiceText,\n      BitType.highlightText,\n      BitType.trueFalse,\n      BitType.trueFalse1,\n      BitType.multipleResponse,\n      BitType.multipleResponse1,\n      BitType.multipleChoice,\n      BitType.multipleChoice1,\n    ])\n  ) {\n    //\n    handleGapOrSelectOrTrueFalseExample(context, content, example, target);\n    //\n  } else if (Config.isOfBitType(bitType, BitType.mark)) {\n    // Default only example handling\n    handleDefaultOnlyExample(context, content, example, target);\n    //\n  } else {\n    // Standard example handling\n    handleStandardStringExample(context, content, example, target);\n    //\n  }\n}\n\nfunction handleGapOrSelectOrTrueFalseExample(\n  context: BitmarkPegParserContext,\n  content: BitContent,\n  example: BreakscapedString | boolean,\n  target: BitContentProcessorResult,\n): void {\n  const { bitType, textFormat } = context;\n  let trueFalse: TrueFalseValue | undefined;\n\n  if (Array.isArray(target.trueFalse) && target.trueFalse.length > 0) {\n    trueFalse = target.trueFalse[target.trueFalse.length - 1] ?? undefined;\n  }\n\n  if (trueFalse) {\n    // Example is set on the true/false tag [+...] / [-...]\n    if (example === true) {\n      trueFalse.__isDefaultExample = true;\n      trueFalse.example = !!trueFalse.isCorrect;\n    } else {\n      if (BooleanUtils.isBooleanString(example)) {\n        trueFalse.example = BooleanUtils.toBoolean(example);\n      } else {\n        // Example is set to a value other than true / false which is not valid in the case of select\n        trueFalse.__isDefaultExample = true;\n        trueFalse.example = undefined;\n        context.addWarning(\n          `Only 'true' / 'false' / default are allowed here, using default`,\n          content,\n        );\n      }\n    }\n  } else if (Array.isArray(target.__solutionsAst) && target.__solutionsAst.length > 0) {\n    // Example is set on the gap solution tag [_...]\n    if (example === true) {\n      // Extract the solution nearest [@example] tag as the example value\n      target.example = target.__solutionsAst[target.__solutionsAst.length - 1] ?? undefined;\n    } else {\n      target.example = example\n        ? textParser.toAst(example, {\n            format: textFormat,\n            location: TextLocation.tag,\n          })\n        : undefined;\n    }\n  } else {\n    // Example is higher up the chain, so how it is handled depends on the bit type\n    if (\n      Config.isOfBitType(bitType, [\n        BitType.multipleChoiceText,\n        BitType.highlightText,\n        BitType.trueFalse,\n        BitType.trueFalse1,\n        BitType.multipleResponse,\n        BitType.multipleResponse1,\n      ])\n    ) {\n      // Treat as a standard boolean\n      handleStandardBooleanExample(context, content, example, target);\n      //\n    } else if (\n      Config.isOfBitType(bitType, [\n        BitType.clozeAndMultipleChoiceText,\n        BitType.multipleChoice,\n        BitType.multipleChoice1,\n      ])\n    ) {\n      // For these bits, a specific example value higher up the chain makes no sense\n      // Set example to default, and raise a warning if any value is set.\n      target.__isDefaultExample = true;\n      target.example = undefined;\n\n      if (example !== true) {\n        // Example is set to a value other than true / false which is not valid in the case of select\n        context.addWarning(\n          `At this level, only default [@example] is allowed, using default`,\n          content,\n        );\n      }\n      //\n    } else {\n      // Treat as a standard string\n      handleStandardStringExample(context, content, example, target);\n      //\n    }\n  }\n}\n\nfunction handleDefaultOnlyExample(\n  context: BitmarkPegParserContext,\n  content: BitContent,\n  example: string | boolean,\n  target: BitContentProcessorResult,\n): void {\n  // This bit can have only default examples - nothing else makes sense\n  target.__isDefaultExample = true;\n  target.example = undefined;\n\n  if (example !== true) {\n    // Example is set to a value other than true / false which is not valid in the case of select\n    context.addWarning(`Only default [@example] is allowed, using default`, content);\n  }\n}\n\nfunction handleStandardBooleanExample(\n  context: BitmarkPegParserContext,\n  content: BitContent,\n  example: BreakscapedString | boolean,\n  target: BitContentProcessorResult,\n): void {\n  if (example === true) {\n    target.__isDefaultExample = true;\n    target.example = undefined;\n  } else {\n    const exampleStr = example\n      ? Breakscape.unbreakscape(example, {\n          format: TextFormat.bitmarkText,\n          location: TextLocation.tag,\n        })\n      : undefined;\n    if (BooleanUtils.isBooleanString(exampleStr)) {\n      target.example = BooleanUtils.toBoolean(exampleStr);\n    } else {\n      // Example is set to a value other than true / false which is not valid in the case of select\n      target.__isDefaultExample = true;\n      target.example = undefined;\n      context.addWarning(\n        `Only 'true' / 'false' / default are allowed here, using default`,\n        content,\n      );\n    }\n  }\n}\n\nfunction handleStandardStringExample(\n  context: BitmarkPegParserContext,\n  _content: BitContent,\n  example: BreakscapedString | boolean,\n  target: BitContentProcessorResult,\n): void {\n  const { textFormat } = context;\n  if (example === true || example === 'true') {\n    target.__isDefaultExample = true;\n    target.example = undefined;\n  } else {\n    target.example = example\n      ? textParser.toAst(example, { format: textFormat, location: TextLocation.tag })\n      : undefined;\n  }\n}\n\nexport { exampleTagContentProcessor };\n","import { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { type GroupTagJson } from '../../../../model/json/BitJson.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type TypeKeyValue,\n} from '../BitmarkPegParserTypes.ts';\n\n// const textParser = new TextParser();\n\nfunction groupTagChainContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  // const { textFormat } = context;\n  const { value } = content as TypeKeyValue;\n\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('groupTag content', content);\n\n  const tags = context.bitContentProcessor(BitContentLevel.Chain, tagsConfig, content.chain);\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('groupTag TAGS', tags);\n\n  const { tag } = tags;\n\n  // Extract the technicalTerm from the content tag\n  const name = StringUtils.trimmedString(value) ?? '';\n\n  const node: Partial<GroupTagJson> = {\n    name,\n    tags: tag ?? [],\n  };\n\n  if (!Array.isArray(target.groupTag)) target.groupTag = [];\n  target.groupTag.push(node);\n}\n\nexport { groupTagChainContentProcessor };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { Config } from '../../../../config/Config.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { ConfigKey } from '../../../../model/config/enum/ConfigKey.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { type ImageSourceJson } from '../../../../model/json/BitJson.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type TypeKeyValue,\n  type TypeValue,\n} from '../BitmarkPegParserTypes.ts';\n\nfunction imageSourceChainContentProcessor(\n  context: BitmarkPegParserContext,\n  contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  if (contentDepth === BitContentLevel.Chain) {\n    imageSourceTagContentProcessor(context, contentDepth, tagsConfig, content, target);\n  } else {\n    buildImageSource(context, contentDepth, tagsConfig, content, target);\n  }\n}\n\nfunction imageSourceTagContentProcessor(\n  _context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  _tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { value } = content as TypeValue;\n\n  // Extract the url from the content tag\n  const url = Breakscape.unbreakscape(StringUtils.trimmedString(value) as BreakscapedString, {\n    format: TextFormat.bitmarkText,\n    location: TextLocation.tag,\n  });\n\n  target.imageSourceUrl = url;\n}\n\nfunction buildImageSource(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('imageSource content', content);\n\n  const { key: tag } = content as TypeKeyValue;\n  const imageSourceConfig = Config.getTagConfigForTag(tagsConfig, Enum(ConfigKey).fromValue(tag));\n\n  const tags = context.bitContentProcessor(BitContentLevel.Chain, tagsConfig, [content]);\n  const chainTags = context.bitContentProcessor(\n    BitContentLevel.Chain,\n    imageSourceConfig?.chain,\n    content.chain,\n  );\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('imageSource TAGS', chainTags);\n\n  const { imageSourceUrl: url } = tags;\n  const { mockupId, ...rest } = chainTags;\n\n  if (!url) {\n    context.addWarning('[@imageSource] is missing the image url', content);\n  }\n  if (!mockupId) {\n    context.addWarning('[@mockupId:xxx] is missing from [@imageSource]', content);\n  }\n\n  const imageSource: Partial<ImageSourceJson> = {\n    url: url ?? '',\n    mockupId: mockupId ?? '',\n    ...rest,\n  };\n\n  target.imageSource = imageSource;\n}\n\nexport { imageSourceChainContentProcessor };\n","import { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport {\n  type BitContent,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type TypeValue,\n} from '../BitmarkPegParserTypes.ts';\n\nfunction commentTagContentProcessor(\n  _context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  if (!target.internalComments) return;\n\n  const { value } = content as TypeValue;\n\n  const internalComment: BreakscapedString | undefined = StringUtils.isString(value)\n    ? (StringUtils.trimmedString(value) as BreakscapedString)\n    : undefined;\n  if (!internalComment) return;\n\n  target.internalComments.push(internalComment);\n}\nexport { commentTagContentProcessor };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { Config } from '../../../../config/Config.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { ConfigKey } from '../../../../model/config/enum/ConfigKey.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { type MarkConfigJson } from '../../../../model/json/BitJson.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type TypeKeyValue,\n} from '../BitmarkPegParserTypes.ts';\n\nfunction markConfigChainContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { key: tag } = content as TypeKeyValue;\n\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('mark content', content);\n\n  const markConfig = target.markConfig;\n\n  if (!markConfig) return;\n\n  const markTagConfig = Config.getTagConfigForTag(tagsConfig, Enum(ConfigKey).fromValue(tag));\n\n  const { mark: _ignoreMark, ...tags } = context.bitContentProcessor(\n    BitContentLevel.Chain,\n    markTagConfig?.chain,\n    content.chain,\n  );\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('mark TAGS', tags);\n\n  // Extract the name from the content tag\n  const mark: string = Breakscape.unbreakscape(\n    (StringUtils.trimmedString(content.value) ?? 'unknown') as BreakscapedString,\n    {\n      format: TextFormat.bitmarkText,\n      location: TextLocation.tag,\n    },\n  );\n\n  const config: Partial<MarkConfigJson> = {\n    mark,\n    emphasis: 'underline' as string,\n    ...tags,\n  };\n\n  if (config) markConfig.push(config);\n}\n\nexport { markConfigChainContentProcessor };\n","import { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { ResourceType } from '../../../../model/enum/ResourceType.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { type PersonJson } from '../../../../model/json/BitJson.ts';\nimport {\n  type ImageResourceWrapperJson,\n  type ResourceJson,\n} from '../../../../model/json/ResourceJson.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n} from '../BitmarkPegParserTypes.ts';\n\nfunction personChainContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  // const { value } = content as TypeValue;\n\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('person content', content);\n\n  const tags = context.bitContentProcessor(BitContentLevel.Chain, tagsConfig, content.chain);\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('person TAGS', tags);\n\n  const { propertyTitle, resources } = tags;\n\n  // Extract the name from the content tag\n  const name = Breakscape.unbreakscape(\n    StringUtils.trimmedString(content.value) as BreakscapedString,\n    {\n      format: TextFormat.bitmarkText,\n      location: TextLocation.tag,\n    },\n  );\n\n  // Extract the title from the propertyTitle tag\n  const title = StringUtils.trimmedString(propertyTitle);\n\n  // Extract avatarImage from the resources\n  const avatarImage = extractAvatarImage(context, resources);\n\n  const person: Partial<PersonJson> = {\n    name,\n    title,\n    avatarImage,\n  };\n\n  target.person = person;\n}\n\nfunction extractAvatarImage(\n  context: BitmarkPegParserContext,\n  resources: ResourceJson[] | undefined,\n): ImageResourceWrapperJson | undefined {\n  // Extract avatarImage from the resources\n  // Return the actual resource, and add all other resources to excess resources\n  let avatarImage: ImageResourceWrapperJson | undefined;\n  const excessResources: ResourceJson[] = [];\n\n  if (resources) {\n    for (const r of resources.reverse()) {\n      if (!avatarImage && ResourceType.image === r.type) {\n        avatarImage = r;\n      } else {\n        excessResources.push(r);\n      }\n    }\n  }\n\n  if (excessResources.length > 0) {\n    // Add an warning to warn about the excess resources\n    context.addWarning(\n      `${excessResources.length} excess resource(s) present in the [@person] chain.`,\n    );\n  }\n\n  return avatarImage;\n}\n\nexport { personChainContentProcessor };\n","import { ConfigKey } from '../../../../model/config/enum/ConfigKey.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { type RatingLevelStartEndJson } from '../../../../model/json/BitJson.ts';\nimport { NumberUtils } from '../../../../utils/NumberUtils.ts';\nimport { TextParser } from '../../../text/TextParser.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type TypeKeyValue,\n} from '../BitmarkPegParserTypes.ts';\n\nconst textParser = new TextParser();\n\nfunction ratingLevelChainContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { textFormat } = context;\n  const { key, value } = content as TypeKeyValue;\n\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('ratingLevel content', content);\n\n  const tags = context.bitContentProcessor(BitContentLevel.Chain, tagsConfig, content.chain);\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('ratingLevel TAGS', tags);\n\n  const { label } = tags;\n\n  // Extract the technicalTerm from the content tag\n  const level = NumberUtils.asNumber(value) ?? 0;\n\n  const node: Partial<RatingLevelStartEndJson> = {\n    level,\n    label: label\n      ? textParser.toAst(label, { format: textFormat, location: TextLocation.tag })\n      : undefined,\n  };\n\n  switch (key) {\n    case ConfigKey.property_ratingLevelStart:\n      target.ratingLevelStart = node;\n\n      break;\n    case ConfigKey.property_ratingLevelEnd:\n      target.ratingLevelEnd = node;\n\n      break;\n    default:\n    // Do nothing\n  }\n}\n\nexport { ratingLevelChainContentProcessor };\n","import { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { type ServingsJson } from '../../../../model/json/BitJson.ts';\nimport { NumberUtils } from '../../../../utils/NumberUtils.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n} from '../BitmarkPegParserTypes.ts';\n\nfunction servingsChainContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  // const { value } = content as TypeValue;\n\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('servings content', content);\n\n  const tags = context.bitContentProcessor(BitContentLevel.Chain, tagsConfig, content.chain);\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('servings TAGS', tags);\n\n  const {\n    unit,\n    unitPlural,\n    unitAbbr,\n    unitAbbrPlural,\n    decimalPlaces,\n    disableCalculation,\n    __hintString,\n  } = tags;\n\n  // Extract the servings from the content tag\n  const servings = NumberUtils.asNumber(content.value) ?? 1;\n\n  const node: Partial<ServingsJson> = {\n    servings,\n    unit,\n    unitPlural,\n    unitAbbr,\n    unitAbbrPlural,\n    decimalPlaces: decimalPlaces ?? 1,\n    disableCalculation,\n    hint: __hintString,\n  };\n\n  target.servings = node;\n}\n\nexport { servingsChainContentProcessor };\n","import { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { type TechnicalTermJson } from '../../../../model/json/BitJson.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n} from '../BitmarkPegParserTypes.ts';\n\nfunction technicalTermChainContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  // const { value } = content as TypeValue;\n\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('technicalTerm content', content);\n\n  const tags = context.bitContentProcessor(BitContentLevel.Chain, tagsConfig, content.chain);\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('technicalTerm TAGS', tags);\n\n  const { lang } = tags;\n\n  // Extract the technicalTerm from the content tag\n  const technicalTerm = Breakscape.unbreakscape(\n    StringUtils.trimmedString(content.value) as BreakscapedString,\n    {\n      format: TextFormat.bitmarkText,\n      location: TextLocation.tag,\n    },\n  );\n\n  const node: Partial<TechnicalTermJson> = {\n    technicalTerm,\n    lang,\n  };\n\n  target.technicalTerm = node;\n}\n\nexport { technicalTermChainContentProcessor };\n","import { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type TypeValue,\n} from '../BitmarkPegParserTypes.ts';\n\nfunction referenceTagContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { value, chain } = content as TypeValue;\n\n  const trimmedStringValue = StringUtils.trimmedString(value) as BreakscapedString;\n\n  target.reference = Breakscape.unbreakscape(trimmedStringValue, {\n    format: TextFormat.bitmarkText,\n    location: TextLocation.tag,\n  });\n\n  // A chained [►] under a [►] is referenceEnd (per the bit config: tag_reference → chain: tag_reference).\n  if (Array.isArray(chain) && chain.length > 0) {\n    const sub = context.bitContentProcessor(BitContentLevel.Chain, tagsConfig, chain);\n    if (sub.reference != null) {\n      target.referenceEnd = sub.reference;\n    }\n  }\n}\nexport { referenceTagContentProcessor };\n","import { Enum } from '@ncoderz/superenum';\n\nimport { ResourceBuilder } from '../../../../ast/ResourceBuilder.ts';\nimport { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { Config } from '../../../../config/Config.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { ConfigKey, type ConfigKeyType } from '../../../../model/config/enum/ConfigKey.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { Count } from '../../../../model/enum/Count.ts';\nimport { ResourceType } from '../../../../model/enum/ResourceType.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport {\n  type ImageResourceJson,\n  type ImageResourceWrapperJson,\n  type ResourceJson,\n} from '../../../../model/json/ResourceJson.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type TypeKeyValue,\n} from '../BitmarkPegParserTypes.ts';\n\n// const builder = new Builder();\nconst resourceBuilder = new ResourceBuilder();\n\n/**\n * Get the valid resource from all the resources on the bit, and add the invalid ones to\n * excess resources\n *\n * @param resourceTypeAttachment the resource type specified in the bit header\n * @param resources the resources on the bit\n */\nfunction buildResources(\n  context: BitmarkPegParserContext,\n  resourceTypeAttachment: string | undefined,\n  resources: ResourceJson[] | undefined,\n): ResourceJson[] | undefined {\n  const { bitType } = context;\n  const filteredResources: ResourceJson[] = [];\n  const excessResources: ResourceJson[] = [];\n\n  const validatedResourceTypeAttachemnt = Enum(ResourceType).fromValue(resourceTypeAttachment);\n\n  // Get the bit configuration for the bit\n  const resourcesConfig = Config.getBitResourcesConfig(bitType, validatedResourceTypeAttachemnt);\n  const resourceAttachmentAllowed = resourcesConfig.resourceAttachmentAllowed;\n  const countsMin = resourcesConfig.getCountsMin(); // Returns a copy, so it can be modified\n  const countsMax = resourcesConfig.getCountsMax(); // Returns a copy, so it can be modified\n\n  // Find the excess resources and ensure we have the minimum resources\n  if (resources) {\n    for (const r of resources.reverse()) {\n      const configKey = r.__configKey;\n      let countMin = countsMin.get(configKey) ?? 0;\n      let countMax = countsMax.get(configKey) ?? 0;\n\n      // Decrement the minimum count and later ensure it is 0\n      countMin = Math.max(0, countMin - 1);\n\n      if (countMax === Count.infinity) {\n        filteredResources.unshift(r);\n      } else if (countMax > 0) {\n        // We still have a count left for this resource\n        filteredResources.unshift(r);\n        countMax--;\n      } else {\n        excessResources.unshift(r);\n      }\n\n      // Set the new counts\n      countsMin.set(configKey, countMin);\n      countsMax.set(configKey, countMax);\n\n      if (r.__invalid) {\n        context.addWarning(`Resource type [&${r.type}] is not valid`);\n      }\n    }\n  }\n\n  // Raise a warning if the resource type is specified in the bit header, but no extra resource attachment is allowed\n  if (!resourceAttachmentAllowed && resourceTypeAttachment) {\n    const warningMsg = `Resource type [&${resourceTypeAttachment}] is specified in the bit header, but no extra resource is allowed for this bit.`;\n    context.addWarning(warningMsg);\n  } else if (filteredResources.length === 0 && resourceTypeAttachment) {\n    context.addWarning(\n      `Resource type [&${resourceTypeAttachment}] is specified in the bit header, but no such resource is present`,\n    );\n  }\n\n  excessResources.forEach((r) => {\n    r.__excessResource = true;\n    filteredResources.push(r);\n  });\n\n  return filteredResources;\n}\n\nfunction resourceContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { type: _ignoreType, key, value, chain } = content as TypeKeyValue<BreakscapedString>;\n\n  const resources = target.resources;\n\n  if (!resources) return;\n\n  const configKey = Enum(ConfigKey).fromValue(key);\n  if (!configKey) return;\n  const resourceType =\n    Enum(ResourceType).fromKey(configKey.replace(/^&/, '')) ?? ResourceType.unknown;\n\n  // Parse the resource chain\n  const resourceConfig = Config.getTagConfigForTag(tagsConfig, configKey);\n\n  // const { posterImage, ...tags } = context.bitContentProcessor(\n  //   BitContentLevel.Chain,\n  //   bitType,\n  //   textFormat,\n  //   resourceConfig?.chain,\n  //   chain,\n  // );\n\n  // // If the chain contains a poster image, the chain is split at this point, and any tags after the poster image\n  // // apply to the poster image, not the original resource.\n  // const { originalChain, posterImageChain } = extractPosterImageChain(chain);\n  // const posterImageChainConfig = resourceConfig?.chain?.posterImage?.chain;\n\n  // // Process the poster image chain\n  // const { posterImage: unused, ...posterImageTags } = context.bitContentProcessor(\n  //   BitContentLevel.Chain,\n  //   bitType,\n  //   textFormat,\n  //   posterImageChainConfig,\n  //   posterImageChain,\n  // );\n  // unused;\n\n  // // Process the remaining chain\n  // const { posterImage, ...tags } = context.bitContentProcessor(\n  //   BitContentLevel.Chain,\n  //   bitType,\n  //   textFormat,\n  //   resourceConfig?.chain,\n  //   originalChain,\n  // );\n\n  // Process the chain\n  const { posterImage, ...tags } = context.bitContentProcessor(\n    BitContentLevel.Chain,\n    resourceConfig?.chain,\n    chain,\n  );\n\n  // Handle the poster image\n  let posterImageResource: ImageResourceJson | undefined;\n  if (posterImage) {\n    // Process the poster image chain\n    const { subConfig: posterImageChainConfig, subChain: posterImageChain } = extractSubChain(\n      resourceConfig?.chain,\n      chain,\n      ConfigKey.property_posterImage,\n    );\n\n    const { posterImage: _unused, ...posterImageTags } = context.bitContentProcessor(\n      BitContentLevel.Chain,\n      posterImageChainConfig,\n      posterImageChain,\n    );\n\n    // Build the poster image resource\n    posterImageResource = (\n      resourceBuilder.resource(context, {\n        type: ResourceType.image,\n        value: posterImage,\n        ...posterImageTags,\n      }) as ImageResourceWrapperJson\n    ).image;\n  }\n\n  const resource = resourceBuilder.resource(context, {\n    type: resourceType,\n    value: Breakscape.unbreakscape(value, {\n      format: TextFormat.bitmarkText,\n      location: TextLocation.tag,\n    }),\n    posterImage: posterImageResource,\n    ...tags,\n  });\n  if (resource) {\n    // Depending on the resource type, add it to the appropriate part of the target\n    if (\n      configKey === ConfigKey.resource_backgroundWallpaper ||\n      configKey === ConfigKey.resource_imagePlaceholder ||\n      configKey === ConfigKey.resource_platformIcon ||\n      configKey === ConfigKey.resource_platformLogo ||\n      configKey === ConfigKey.resource_platformBackgroundImage ||\n      configKey === ConfigKey.resource_previewImage ||\n      configKey === ConfigKey.resource_previewVideo ||\n      configKey === ConfigKey.resource_coverImage ||\n      configKey === ConfigKey.resource_backgroundImage\n    ) {\n      if (target.propertyStyleResources) {\n        if (target.propertyStyleResources[resourceType]) {\n          if (!Array.isArray(target.propertyStyleResources[resourceType])) {\n            target.propertyStyleResources[resourceType] = [\n              target.propertyStyleResources[resourceType] as ResourceJson,\n            ];\n          }\n          (target.propertyStyleResources[resourceType] as ResourceJson[]).push(resource);\n        } else {\n          target.propertyStyleResources[resourceType] = resource;\n        }\n      }\n    } else {\n      resources.push(resource);\n    }\n  }\n}\n\nfunction extractSubChain(\n  config: TagsConfig | undefined,\n  chain: BitContent[] | undefined,\n  configKey: ConfigKeyType,\n): { subConfig: TagsConfig | undefined; subChain: BitContent[] | undefined } {\n  let subConfig: TagsConfig | undefined;\n  if (config) {\n    subConfig = config[configKey]?.chain;\n  }\n\n  const subChain = chain?.reduce(\n    (acc, c) => {\n      if (acc) return acc;\n      const tkv = c as TypeKeyValue;\n      if (tkv.key === configKey) return tkv.chain;\n      return undefined;\n    },\n    undefined as BitContent[] | undefined,\n  );\n\n  return { subConfig, subChain };\n}\n\nexport { buildResources, resourceContentProcessor };\n","import { Config } from '../../../../config/Config.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { type TextAst } from '../../../../model/ast/TextNodes.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { BitType, type BitTypeType } from '../../../../model/enum/BitType.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport { TextParser } from '../../../text/TextParser.ts';\nimport {\n  type BitContent,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type BitSpecificTitles,\n  type ContentDepthType,\n  type TypeValue,\n} from '../BitmarkPegParserTypes.ts';\n\nconst textParser = new TextParser();\n\nfunction titleTagContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  _tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { textFormat } = context;\n  const { value } = content as TypeValue;\n\n  const title = target.title;\n\n  if (!title) return;\n\n  // Parse the title and its level\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const titleValue: { title: string; level: string[] } = value as any;\n  const titleText = StringUtils.trimmedString(titleValue.title) as BreakscapedString;\n  const level = titleValue.level.length;\n  title[level] = {\n    //\n    titleAst: textParser.toAst(titleText ?? '', {\n      format: textFormat,\n      location: TextLocation.tag,\n    }),\n    titleString: titleText ?? '',\n  };\n}\n\nfunction buildTitles(\n  _context: BitmarkPegParserContext,\n  bitType: BitTypeType,\n  title: { titleAst: TextAst; titleString: string }[] | undefined,\n): BitSpecificTitles {\n  title = title ?? [];\n\n  if (Config.isOfBitType(bitType, BitType.chapter)) {\n    let t: { titleAst: TextAst; titleString: string } | undefined;\n    if (title.length > 0) t = title[title.length - 1];\n\n    return {\n      title: t?.titleAst ?? [],\n      titleString: t?.titleString ?? '',\n      level: title.length > 0 ? title.length - 1 : undefined,\n    };\n  } else {\n    if (Array.isArray(title)) {\n      return {\n        title: title[1]?.titleAst ?? undefined,\n        titleString: title[1]?.titleString ?? undefined,\n        subtitle: title[2]?.titleAst ?? undefined,\n        subtitleString: title[2]?.titleString ?? undefined,\n      };\n    } else {\n      // Special case for title property (string, not bitmark text)\n      return {\n        title: undefined,\n        titleString: title ?? undefined,\n        subtitle: undefined,\n        subtitleString: undefined,\n      };\n    }\n  }\n}\n\nexport { buildTitles, titleTagContentProcessor };\n","import { Breakscape } from '../../../../breakscaping/Breakscape.ts';\nimport { type BreakscapedString } from '../../../../model/ast/BreakscapedString.ts';\nimport { TextFormat } from '../../../../model/enum/TextFormat.ts';\nimport { TextLocation } from '../../../../model/enum/TextLocation.ts';\nimport { StringUtils } from '../../../../utils/StringUtils.ts';\nimport { TextParser } from '../../../text/TextParser.ts';\nimport {\n  type BitContent,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  TypeKey,\n  type TypeValue,\n} from '../BitmarkPegParserTypes.ts';\n\nconst textParser = new TextParser();\n\nfunction trueFalseTagContentProcessor(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  content: BitContent,\n  target: BitContentProcessorResult,\n): void {\n  const { textFormat } = context;\n  const { type, value } = content as TypeValue;\n\n  const trueFalse = target.trueFalse;\n\n  if (!trueFalse) return;\n\n  const trimmedStringValue = Breakscape.unbreakscape(\n    StringUtils.trimmedString(value) as BreakscapedString,\n    {\n      format: TextFormat.bitmarkText,\n      location: TextLocation.tag,\n    },\n  );\n\n  const textAst = textParser.toAst(trimmedStringValue ?? '', {\n    format: textFormat,\n    location: TextLocation.tag,\n  });\n\n  trueFalse.push({\n    text: trimmedStringValue,\n    textAst,\n    isCorrect: type === TypeKey.True,\n    __isDefaultExample: false,\n  });\n}\nexport { trueFalseTagContentProcessor };\n","import { Config } from '../../../../config/Config.ts';\nimport { type BodyPart } from '../../../../model/ast/Nodes.ts';\nimport { type TagsConfig } from '../../../../model/config/TagsConfig.ts';\nimport { BitType } from '../../../../model/enum/BitType.ts';\nimport { BodyBitType } from '../../../../model/enum/BodyBitType.ts';\nimport {\n  type ChoiceJson,\n  type ResponseJson,\n  type StatementJson,\n} from '../../../../model/json/BitJson.ts';\nimport {\n  type HighlightJson,\n  type HighlightTextJson,\n  type SelectJson,\n  type SelectOptionJson,\n} from '../../../../model/json/BodyBitJson.ts';\nimport {\n  type BitContent,\n  BitContentLevel,\n  type BitContentProcessorResult,\n  type BitmarkPegParserContext,\n  type ContentDepthType,\n  type StatementsOrChoicesOrResponses,\n  type TrueFalseValue,\n  TypeKey,\n} from '../BitmarkPegParserTypes.ts';\nimport { trueFalseTagContentProcessor } from './TrueFalseTagContentProcessor.ts';\n\nfunction trueFalseChainContentProcessor(\n  context: BitmarkPegParserContext,\n  contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n  bodyParts: BodyPart[],\n): void {\n  if (contentDepth === BitContentLevel.Chain) {\n    trueFalseTagContentProcessor(context, BitContentLevel.Chain, content, target);\n  } else {\n    buildTrueFalse(context, contentDepth, tagsConfig, content, target, bodyParts);\n  }\n}\n\nfunction buildTrueFalse(\n  context: BitmarkPegParserContext,\n  _contentDepth: ContentDepthType,\n  tagsConfig: TagsConfig | undefined,\n  content: BitContent,\n  target: BitContentProcessorResult,\n  bodyParts: BodyPart[],\n): void {\n  const { bitType } = context;\n  const chainContent = [content, ...(content.chain ?? [])];\n\n  const statements = target.statements;\n  const choices = target.choices;\n  const responses = target.responses;\n\n  if (!statements || !choices || !responses || !bodyParts) return;\n\n  if (Config.isOfBitType(bitType, BitType.trueFalse1)) {\n    // Treat as true/false for statement\n    target.statement = buildStatement(context, tagsConfig, chainContent);\n  } else if (\n    Config.isOfBitType(bitType, [\n      BitType.trueFalse,\n      BitType.multipleChoice,\n      BitType.multipleChoice1,\n      BitType.multipleResponse,\n      BitType.multipleResponse1,\n      BitType.feedback,\n    ])\n  ) {\n    // Treat as true/false for choices / responses\n    const tf = buildStatementsChoicesResponses(context, tagsConfig, chainContent);\n\n    if (tf.statements) statements.push(...tf.statements);\n    if (tf.choices) choices.push(...tf.choices);\n    if (tf.responses) responses.push(...tf.responses);\n  } else if (Config.isOfBitType(bitType, BitType.highlightText)) {\n    // Treat as highlight text\n    const highlight = buildHighlight(context, tagsConfig, chainContent);\n    if (highlight) bodyParts.push(highlight as BodyPart);\n  } else {\n    // Treat as select\n    const select = buildSelect(context, tagsConfig, chainContent);\n    if (select) bodyParts.push(select as BodyPart);\n  }\n}\n\n/**\n * Build statement for the bit:\n * .trueFalse-1\n *\n * @param bitType\n * @param trueFalseContent\n * @returns\n */\nfunction buildStatement(\n  context: BitmarkPegParserContext,\n  tagsConfig: TagsConfig | undefined,\n  trueFalseContent: BitContent[],\n): Partial<StatementJson> | undefined {\n  const { bitType } = context;\n  if (!Config.isOfBitType(bitType, BitType.trueFalse1)) return undefined;\n\n  if (context.DEBUG_CHAIN_CONTENT)\n    context.debugPrint('trueFalse V1 content (statement)', trueFalseContent);\n\n  const { trueFalse, ...tags } = context.bitContentProcessor(\n    BitContentLevel.Chain,\n    tagsConfig,\n    trueFalseContent,\n  );\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('trueFalse V1 tags (statement)', tags);\n\n  let statement: Partial<StatementJson> | undefined;\n\n  let firstTrueFalse: TrueFalseValue | undefined;\n  if (trueFalse && trueFalse.length > 0) {\n    firstTrueFalse = trueFalse[0];\n  }\n\n  if (firstTrueFalse) {\n    // Have to remove the statement JSON tag to keep typescript happy\n    const { statement: _ignore, ...tagsRest } = tags;\n    statement = { ...firstTrueFalse, statement: firstTrueFalse.text, ...tagsRest };\n  }\n\n  return statement;\n}\n\n/**\n * Build statements / choices / responses for the bits:\n * .multiple-choice, .multiple-choice-1, .mutliple-response, .mutliple-response-1, .trueFalse, etc\n *\n * @param bitType\n * @param trueFalseContent\n * @returns\n */\nfunction buildStatementsChoicesResponses(\n  context: BitmarkPegParserContext,\n  tagsConfig: TagsConfig | undefined,\n  trueFalseContent: BitContent[],\n): StatementsOrChoicesOrResponses {\n  const { bitType } = context;\n  // NOTE: We handle V1 tags in V2 multiple-choice / multiple-response for maxium backwards compatibility\n  const insertStatements = Config.isOfBitType(bitType, BitType.trueFalse);\n  const insertChoices = Config.isOfBitType(bitType, [\n    BitType.multipleChoice,\n    BitType.multipleChoice1,\n    BitType.feedback,\n  ]);\n  const insertResponses = Config.isOfBitType(bitType, [\n    BitType.multipleResponse,\n    BitType.multipleResponse1,\n  ]);\n  if (!insertStatements && !insertChoices && !insertResponses) return {};\n\n  const statements: Partial<StatementJson>[] = [];\n  const choices: Partial<ChoiceJson>[] = [];\n  const responses: Partial<ResponseJson>[] = [];\n\n  const trueFalseContents = context.splitBitContent(trueFalseContent, [\n    TypeKey.True,\n    TypeKey.False,\n  ]);\n\n  if (context.DEBUG_CHAIN_CONTENT) {\n    context.debugPrint('trueFalse V1 content (choices/responses)', trueFalseContents);\n  }\n\n  for (const contents of trueFalseContents) {\n    const { trueFalse, ...tags } = context.bitContentProcessor(\n      BitContentLevel.Chain,\n      tagsConfig,\n      contents,\n    );\n\n    if (context.DEBUG_CHAIN_TAGS) context.debugPrint('trueFalse V1 tags (choices/responses)', tags);\n\n    let firstTrueFalse: TrueFalseValue | undefined;\n    if (trueFalse && trueFalse.length > 0) {\n      firstTrueFalse = trueFalse[0];\n    }\n\n    if (firstTrueFalse) {\n      if (insertStatements) {\n        // Have to remove the statement JSON tag to keep typescript happy\n        const { statement: _ignore, ...tagsRest } = tags;\n\n        const statement: Partial<StatementJson> = {\n          ...firstTrueFalse,\n          statement: firstTrueFalse.textAst ?? [],\n          ...tagsRest,\n        };\n        if (statement) statements.push(statement);\n      } else if (insertChoices) {\n        const choice = { ...firstTrueFalse, choice: firstTrueFalse.text, ...tags };\n        if (choice) choices.push(choice);\n      } else if (insertResponses) {\n        const response = { ...firstTrueFalse, response: firstTrueFalse.text, ...tags };\n        if (response) responses.push(response);\n      }\n    }\n  }\n\n  const res: StatementsOrChoicesOrResponses = {};\n  if (insertStatements) {\n    res.statements = statements;\n  } else if (insertChoices) {\n    res.choices = choices;\n  } else if (insertResponses) {\n    res.responses = responses;\n  }\n\n  return res;\n}\n\nfunction buildHighlight(\n  context: BitmarkPegParserContext,\n  tagsConfig: TagsConfig | undefined,\n  highlightContent: BitContent[],\n): Partial<HighlightJson> | undefined {\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('highlight content', highlightContent);\n\n  const { trueFalse, ...tags } = context.bitContentProcessor(\n    BitContentLevel.Chain,\n    tagsConfig,\n    highlightContent,\n  );\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('highlight TAGS', { trueFalse, ...tags });\n\n  const texts: Partial<HighlightTextJson>[] = [];\n  if (trueFalse) {\n    for (const tf of trueFalse) {\n      const ht: Partial<HighlightTextJson> = { ...tf, isHighlighted: false };\n      if (ht) texts.push(ht);\n    }\n  }\n\n  const highlight: Partial<HighlightJson> = {\n    type: BodyBitType.highlight,\n    texts: texts as HighlightTextJson[],\n    ...tags,\n  };\n\n  return highlight;\n}\n\nfunction buildSelect(\n  context: BitmarkPegParserContext,\n  tagsConfig: TagsConfig | undefined,\n  selectContent: BitContent[],\n): Partial<SelectJson> | undefined {\n  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint('select content', selectContent);\n\n  const { trueFalse, ...tags } = context.bitContentProcessor(\n    BitContentLevel.Chain,\n    tagsConfig,\n    selectContent,\n  );\n\n  if (context.DEBUG_CHAIN_TAGS) context.debugPrint('select TAGS', { trueFalse, ...tags });\n\n  const options: Partial<SelectOptionJson>[] = [];\n  if (trueFalse) {\n    for (const tf of trueFalse) {\n      const so: Partial<SelectOptionJson> = tf;\n      if (so) options.push(so);\n    }\n  }\n\n  const select: Partial<SelectJson> = {\n    type: BodyBitType.select,\n    options: options as SelectOptionJson[],\n    ...tags,\n  };\n\n  return select;\n}\n\nexport { trueFalseChainContentProcessor };\n","// @generated by Peggy 5.1.0.\n//\n// https://peggyjs.org/\n\nimport { TypeKey } from \"../../../parser/bitmark/peg/BitmarkPegParserTypes.ts\";\nimport { BitmarkPegParserHelper } from \"../../../parser/bitmark/peg/BitmarkPegParserHelper.ts\";\nimport { BitmarkPegParserProcessor } from \"../../../parser/bitmark/peg/BitmarkPegParserProcessor.ts\";\nimport { Breakscape } from \"../../../breakscaping/Breakscape.ts\";\n\n\n // GLOBAL JS\n\n//\n// Global variables\n//\n\n// None\n\n\nclass peg$SyntaxError extends SyntaxError {\n  constructor(message, expected, found, location) {\n    super(message);\n    this.expected = expected;\n    this.found = found;\n    this.location = location;\n    this.name = \"SyntaxError\";\n  }\n\n  format(sources) {\n    let str = \"Error: \" + this.message;\n    if (this.location) {\n      let src = null;\n      const st = sources.find(s => s.source === this.location.source);\n      if (st) {\n        src = st.text.split(/\\r\\n|\\n|\\r/g);\n      }\n      const s = this.location.start;\n      const offset_s = (this.location.source && (typeof this.location.source.offset === \"function\"))\n        ? this.location.source.offset(s)\n        : s;\n      const loc = this.location.source + \":\" + offset_s.line + \":\" + offset_s.column;\n      if (src) {\n        const e = this.location.end;\n        const filler = \"\".padEnd(offset_s.line.toString().length, \" \");\n        const line = src[s.line - 1];\n        const last = s.line === e.line ? e.column : line.length + 1;\n        const hatLen = (last - s.column) || 1;\n        str += \"\\n --> \" + loc + \"\\n\"\n            + filler + \" |\\n\"\n            + offset_s.line + \" | \" + line + \"\\n\"\n            + filler + \" | \" + \"\".padEnd(s.column - 1, \" \")\n            + \"\".padEnd(hatLen, \"^\");\n      } else {\n        str += \"\\n at \" + loc;\n      }\n    }\n    return str;\n  }\n\n  static buildMessage(expected, found) {\n    function hex(ch) {\n      return ch.codePointAt(0).toString(16).toUpperCase();\n    }\n\n    const nonPrintable = Object.prototype.hasOwnProperty.call(RegExp.prototype, \"unicode\")\n      ? new RegExp(\"[\\\\p{C}\\\\p{Mn}\\\\p{Mc}]\", \"gu\")\n      : null;\n    function unicodeEscape(s) {\n      if (nonPrintable) {\n        return s.replace(nonPrintable,  ch => \"\\\\u{\" + hex(ch) + \"}\");\n      }\n      return s;\n    }\n\n    function literalEscape(s) {\n      return unicodeEscape(s\n        .replace(/\\\\/g, \"\\\\\\\\\")\n        .replace(/\"/g,  \"\\\\\\\"\")\n        .replace(/\\0/g, \"\\\\0\")\n        .replace(/\\t/g, \"\\\\t\")\n        .replace(/\\n/g, \"\\\\n\")\n        .replace(/\\r/g, \"\\\\r\")\n        .replace(/[\\x00-\\x0F]/g,          ch => \"\\\\x0\" + hex(ch))\n        .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, ch => \"\\\\x\"  + hex(ch)));\n    }\n\n    function classEscape(s) {\n      return unicodeEscape(s\n        .replace(/\\\\/g, \"\\\\\\\\\")\n        .replace(/\\]/g, \"\\\\]\")\n        .replace(/\\^/g, \"\\\\^\")\n        .replace(/-/g,  \"\\\\-\")\n        .replace(/\\0/g, \"\\\\0\")\n        .replace(/\\t/g, \"\\\\t\")\n        .replace(/\\n/g, \"\\\\n\")\n        .replace(/\\r/g, \"\\\\r\")\n        .replace(/[\\x00-\\x0F]/g,          ch => \"\\\\x0\" + hex(ch))\n        .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, ch => \"\\\\x\"  + hex(ch)));\n    }\n\n    const DESCRIBE_EXPECTATION_FNS = {\n      literal(expectation) {\n        return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n      },\n\n      class(expectation) {\n        const escapedParts = expectation.parts.map(\n          part => (Array.isArray(part)\n            ? classEscape(part[0]) + \"-\" + classEscape(part[1])\n            : classEscape(part))\n        );\n\n        return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts.join(\"\") + \"]\" + (expectation.unicode ? \"u\" : \"\");\n      },\n\n      any() {\n        return \"any character\";\n      },\n\n      end() {\n        return \"end of input\";\n      },\n\n      other(expectation) {\n        return expectation.description;\n      },\n    };\n\n    function describeExpectation(expectation) {\n      return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n    }\n\n    function describeExpected(expected) {\n      const descriptions = expected.map(describeExpectation);\n      descriptions.sort();\n\n      if (descriptions.length > 0) {\n        let j = 1;\n        for (let i = 1; i < descriptions.length; i++) {\n          if (descriptions[i - 1] !== descriptions[i]) {\n            descriptions[j] = descriptions[i];\n            j++;\n          }\n        }\n        descriptions.length = j;\n      }\n\n      switch (descriptions.length) {\n        case 1:\n          return descriptions[0];\n\n        case 2:\n          return descriptions[0] + \" or \" + descriptions[1];\n\n        default:\n          return descriptions.slice(0, -1).join(\", \")\n            + \", or \"\n            + descriptions[descriptions.length - 1];\n      }\n    }\n\n    function describeFound(found) {\n      return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n    }\n\n    return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n  }\n}\n\nfunction peg$parse(input, options) {\n  options = options !== undefined ? options : {};\n\n  const peg$FAILED = {};\n  const peg$source = options.grammarSource;\n\n  const peg$startRuleFunctions = {\n    bitmark: peg$parsebitmark,\n    bit: peg$parsebit,\n    cardContent: peg$parsecardContent,\n  };\n  let peg$startRuleFunction = peg$parsebitmark;\n\n  const peg$c0 = \"[.\";\n  const peg$c1 = \"]\";\n  const peg$c2 = \"[\";\n  const peg$c3 = \":\";\n  const peg$c4 = \"&\";\n  const peg$c5 = \"$$$$\";\n  const peg$c6 = \"====\";\n  const peg$c7 = \"text\";\n  const peg$c8 = \"~~~~\";\n  const peg$c9 = \"footer\";\n  const peg$c10 = \" \";\n  const peg$c11 = \"--\";\n  const peg$c12 = \"++\";\n  const peg$c13 = \"===\";\n  const peg$c14 = \"==\";\n  const peg$c15 = \"[@id\";\n  const peg$c16 = \"#\";\n  const peg$c17 = \"[\\u25BC\";\n  const peg$c18 = \"[\\u25BA\";\n  const peg$c19 = \"[@\";\n  const peg$c20 = \"[%\";\n  const peg$c21 = \"[!\";\n  const peg$c22 = \"[?\";\n  const peg$c23 = \"[+\";\n  const peg$c24 = \"[-\";\n  const peg$c25 = \"[$\";\n  const peg$c26 = \"[_\";\n  const peg$c27 = \"[=\";\n  const peg$c28 = \"[&\";\n  const peg$c29 = \"^]\";\n  const peg$c30 = \"id:\";\n  const peg$c31 = \".\";\n  const peg$c32 = \"\\n\";\n  const peg$c33 = \"\\r\\n\";\n\n  const peg$r0 = /^[^\\]]/;\n  const peg$r1 = /^[a-z]/;\n  const peg$r2 = /^[a-z0-9\\-]/;\n  const peg$r3 = /^[^:\\]]/;\n  const peg$r4 = /^[^&:\\]]/;\n  const peg$r5 = /^[^\\n\\r\\u2028\\u2029]/;\n  const peg$r6 = /^[ \\t]/;\n  const peg$r7 = /^[\\r\\u2028-\\u2029]/;\n  const peg$r8 = /^[ \\t\\n\\r\\u2028\\u2029]/;\n\n  const peg$e0 = peg$literalExpectation(\"[.\", false);\n  const peg$e1 = peg$classExpectation([\"]\"], true, false, false);\n  const peg$e2 = peg$literalExpectation(\"]\", false);\n  const peg$e3 = peg$literalExpectation(\"[\", false);\n  const peg$e4 = peg$literalExpectation(\":\", false);\n  const peg$e5 = peg$literalExpectation(\"&\", false);\n  const peg$e6 = peg$anyExpectation();\n  const peg$e7 = peg$literalExpectation(\"$$$$\", false);\n  const peg$e8 = peg$literalExpectation(\"====\", false);\n  const peg$e9 = peg$literalExpectation(\"text\", false);\n  const peg$e10 = peg$literalExpectation(\"~~~~\", false);\n  const peg$e11 = peg$literalExpectation(\"footer\", false);\n  const peg$e12 = peg$literalExpectation(\" \", false);\n  const peg$e13 = peg$literalExpectation(\"--\", false);\n  const peg$e14 = peg$literalExpectation(\"++\", false);\n  const peg$e15 = peg$literalExpectation(\"===\", false);\n  const peg$e16 = peg$literalExpectation(\"==\", false);\n  const peg$e17 = peg$classExpectation([[\"a\", \"z\"]], false, false, false);\n  const peg$e18 = peg$classExpectation([[\"a\", \"z\"], [\"0\", \"9\"], \"-\"], false, false, false);\n  const peg$e19 = peg$literalExpectation(\"[@id\", false);\n  const peg$e20 = peg$literalExpectation(\"#\", false);\n  const peg$e21 = peg$literalExpectation(\"[\\u25BC\", false);\n  const peg$e22 = peg$literalExpectation(\"[\\u25BA\", false);\n  const peg$e23 = peg$literalExpectation(\"[@\", false);\n  const peg$e24 = peg$literalExpectation(\"[%\", false);\n  const peg$e25 = peg$literalExpectation(\"[!\", false);\n  const peg$e26 = peg$literalExpectation(\"[?\", false);\n  const peg$e27 = peg$literalExpectation(\"[+\", false);\n  const peg$e28 = peg$literalExpectation(\"[-\", false);\n  const peg$e29 = peg$literalExpectation(\"[$\", false);\n  const peg$e30 = peg$literalExpectation(\"[_\", false);\n  const peg$e31 = peg$literalExpectation(\"[=\", false);\n  const peg$e32 = peg$literalExpectation(\"[&\", false);\n  const peg$e33 = peg$literalExpectation(\"^]\", false);\n  const peg$e34 = peg$literalExpectation(\"id:\", false);\n  const peg$e35 = peg$classExpectation([\":\", \"]\"], true, false, false);\n  const peg$e36 = peg$literalExpectation(\".\", false);\n  const peg$e37 = peg$classExpectation([\"&\", \":\", \"]\"], true, false, false);\n  const peg$e38 = peg$otherExpectation(\"Character\");\n  const peg$e39 = peg$classExpectation([\"\\n\", \"\\r\", \"\\u2028\", \"\\u2029\"], true, false, false);\n  const peg$e40 = peg$otherExpectation(\"Blank Line\");\n  const peg$e41 = peg$classExpectation([\" \", \"\\t\"], false, false, false);\n  const peg$e42 = peg$otherExpectation(\"Line Terminator\");\n  const peg$e43 = peg$literalExpectation(\"\\n\", false);\n  const peg$e44 = peg$literalExpectation(\"\\r\\n\", false);\n  const peg$e45 = peg$classExpectation([\"\\r\", [\"\\u2028\", \"\\u2029\"]], false, false, false);\n  const peg$e46 = peg$otherExpectation(\"Whitespace, then Line Terminator\");\n  const peg$e47 = peg$otherExpectation(\"whitespace\");\n  const peg$e48 = peg$classExpectation([\" \", \"\\t\", \"\\n\", \"\\r\", \"\\u2028\", \"\\u2029\"], false, false, false);\n\n  function peg$f0(firstBit, bits) {    return processor.buildBits([ firstBit, ...bits])  }\n  function peg$f1(bit) {    return helper.handleRawBit(bit);  }\n  function peg$f2(bit) {    return bit;  }\n  function peg$f3(bit) {    return helper.handleRawBit(bit);  }\n  function peg$f4(bitHeader) {    return bitHeader;  }\n  function peg$f5(bit) {    return bit  }\n  function peg$f6(bitHeader, bitContent) {    return processor.buildBit(bitHeader, bitContent)  }\n  function peg$f7(bit) {    return processor.invalidBit(bit)  }\n  function peg$f8(bitLevel, bitType, formatAndResource) {    return processor.buildBitHeader(bitType, bitLevel, formatAndResource)  }\n  function peg$f9(value1, value2) {    return processor.buildTextAndResourceType(value1, value2)  }\n  function peg$f10(value) {    return helper.handleTextFormat(value)  }\n  function peg$f11(value) {    return helper.handleResourceType(value)  }\n  function peg$f12(value) {    return helper.handleBitContent(value)  }\n  function peg$f13(value) {    return helper.handleTagChain(value)  }\n  function peg$f14(value) {    return value  }\n  function peg$f15(value) {    return helper.handleBitTag(value)  }\n  function peg$f16(value) {    return { type: TypeKey.BodyChar, value: value }  }\n  function peg$f17(value) {    return helper.handlePlainTextDivider(value);  }\n  function peg$f18(value) {    return helper.handleFooterDivider(value);  }\n  function peg$f19(value) {    return helper.handleCardSet(value[1].flat());  }\n  function peg$f20() {    helper.handleCardSetStart();  }\n  function peg$f21() {    helper.handleCardSetEnd();  }\n  function peg$f22(value) {    return helper.handleCards(value);  }\n  function peg$f23(value) {    return helper.handleCardLineOrDivider(value, 2);  }\n  function peg$f24(qualifier) {    return [\"====\", qualifier];  }\n  function peg$f25() {    return [\"====\"];  }\n  function peg$f26(qualifier) {    return [\"--\", qualifier];  }\n  function peg$f27() {    return [\"--\"];  }\n  function peg$f28(qualifier) {    return [\"++\", qualifier];  }\n  function peg$f29() {    return [\"++\"];  }\n  function peg$f30(value) {    return helper.handleCardLine(value);  }\n  function peg$f31(value) {    return helper.handleCardSet(value[1].flat());  }\n  function peg$f32() {    helper.handleCardSetStart();  }\n  function peg$f33() {    helper.handleCardSetEnd();  }\n  function peg$f34(value) {    return helper.handleCards(value);  }\n  function peg$f35(value) {    return helper.handleCardLineOrDivider(value, 1);  }\n  function peg$f36(value) {    return helper.handleCardLine(value);  }\n  function peg$f37(value) {    return value;  }\n  function peg$f38(value) {    return helper.handleCardContent(value);  }\n  function peg$f39(value) {    return { type: TypeKey.CardChar, value: value }  }\n  function peg$f40(value) {    return helper.handlePropertyTag(\"id\", value)  }\n  function peg$f41(level, title) {    return helper.handleTag(TypeKey.Title, { level, title })  }\n  function peg$f42(value) {    return helper.handleTag(TypeKey.Anchor, value)  }\n  function peg$f43(value) {    return helper.handleTag(TypeKey.Reference, value)  }\n  function peg$f44(key, value) {    return helper.handlePropertyTag(key, value)  }\n  function peg$f45(value) {    return helper.handleTag(TypeKey.ItemLead, value)  }\n  function peg$f46(value) {    return helper.handleTag(TypeKey.Instruction, value)  }\n  function peg$f47(value) {    return helper.handleTag(TypeKey.Hint, value)  }\n  function peg$f48(value) {    return helper.handleTag(TypeKey.True, value)  }\n  function peg$f49(value) {    return helper.handleTag(TypeKey.False, value)  }\n  function peg$f50(value) {    return helper.handleTag(TypeKey.SampleSolution, value)  }\n  function peg$f51(value) {    return helper.handleTag(TypeKey.Gap, value)  }\n  function peg$f52(value) {    return helper.handleTag(TypeKey.Mark, value)  }\n  function peg$f53(key, value) {    return helper.handleResourceTag(key, value);  }\n  function peg$f54(value) {    return value  }\n  function peg$f55(value) {    return value ? value.trim() : ''  }\n  function peg$f56(value) {    return value.length  }\n  function peg$f57(value) {    return value ? value.trim() : null  }\n  function peg$f58(value) {    return value ? value.trim() : ''  }\n  function peg$f59() {    return true  }\n  let peg$currPos = options.peg$currPos | 0;\n  let peg$savedPos = peg$currPos;\n  const peg$posDetailsCache = [{ line: 1, column: 1 }];\n  let peg$maxFailPos = peg$currPos;\n  let peg$maxFailExpected = options.peg$maxFailExpected || [];\n  let peg$silentFails = options.peg$silentFails | 0;\n\n  let peg$result;\n\n  if (options.startRule) {\n    if (!(options.startRule in peg$startRuleFunctions)) {\n      throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n    }\n\n    peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n  }\n\n  function text() {\n    return input.substring(peg$savedPos, peg$currPos);\n  }\n\n  function offset() {\n    return peg$savedPos;\n  }\n\n  function range() {\n    return {\n      source: peg$source,\n      start: peg$savedPos,\n      end: peg$currPos,\n    };\n  }\n\n  function location() {\n    return peg$computeLocation(peg$savedPos, peg$currPos);\n  }\n\n  function expected(description, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildStructuredError(\n      [peg$otherExpectation(description)],\n      input.substring(peg$savedPos, peg$currPos),\n      location\n    );\n  }\n\n  function error(message, location) {\n    location = location !== undefined\n      ? location\n      : peg$computeLocation(peg$savedPos, peg$currPos);\n\n    throw peg$buildSimpleError(message, location);\n  }\n\n  function peg$getUnicode(pos = peg$currPos) {\n    const cp = input.codePointAt(pos);\n    if (cp === undefined) {\n      return \"\";\n    }\n    return String.fromCodePoint(cp);\n  }\n\n  function peg$literalExpectation(text, ignoreCase) {\n    return { type: \"literal\", text, ignoreCase };\n  }\n\n  function peg$classExpectation(parts, inverted, ignoreCase, unicode) {\n    return { type: \"class\", parts, inverted, ignoreCase, unicode };\n  }\n\n  function peg$anyExpectation() {\n    return { type: \"any\" };\n  }\n\n  function peg$endExpectation() {\n    return { type: \"end\" };\n  }\n\n  function peg$otherExpectation(description) {\n    return { type: \"other\", description };\n  }\n\n  function peg$computePosDetails(pos) {\n    let details = peg$posDetailsCache[pos];\n    let p;\n\n    if (details) {\n      return details;\n    } else {\n      if (pos >= peg$posDetailsCache.length) {\n        p = peg$posDetailsCache.length - 1;\n      } else {\n        p = pos;\n        while (!peg$posDetailsCache[--p]) {}\n      }\n\n      details = peg$posDetailsCache[p];\n      details = {\n        line: details.line,\n        column: details.column,\n      };\n\n      while (p < pos) {\n        if (input.charCodeAt(p) === 10) {\n          details.line++;\n          details.column = 1;\n        } else {\n          details.column++;\n        }\n\n        p++;\n      }\n\n      peg$posDetailsCache[pos] = details;\n\n      return details;\n    }\n  }\n\n  function peg$computeLocation(startPos, endPos, offset) {\n    const startPosDetails = peg$computePosDetails(startPos);\n    const endPosDetails = peg$computePosDetails(endPos);\n\n    const res = {\n      source: peg$source,\n      start: {\n        offset: startPos,\n        line: startPosDetails.line,\n        column: startPosDetails.column,\n      },\n      end: {\n        offset: endPos,\n        line: endPosDetails.line,\n        column: endPosDetails.column,\n      },\n    };\n    if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n      res.start = peg$source.offset(res.start);\n      res.end = peg$source.offset(res.end);\n    }\n    return res;\n  }\n\n  function peg$fail(expected) {\n    if (peg$currPos < peg$maxFailPos) { return; }\n\n    if (peg$currPos > peg$maxFailPos) {\n      peg$maxFailPos = peg$currPos;\n      peg$maxFailExpected = [];\n    }\n\n    peg$maxFailExpected.push(expected);\n  }\n\n  function peg$buildSimpleError(message, location) {\n    return new peg$SyntaxError(message, null, null, location);\n  }\n\n  function peg$buildStructuredError(expected, found, location) {\n    return new peg$SyntaxError(\n      peg$SyntaxError.buildMessage(expected, found),\n      expected,\n      found,\n      location\n    );\n  }\n\n  function peg$parsebitmark() {\n    let s0;\n\n    s0 = peg$parseBM_Bitmark();\n\n    return s0;\n  }\n\n  function peg$parseBM_Bitmark() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseWS();\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$parseWS();\n    }\n    s2 = peg$parseBM_FirstBit();\n    s3 = peg$parseBM_Bits();\n    peg$savedPos = s0;\n    s0 = peg$f0(s2, s3);\n\n    return s0;\n  }\n\n  function peg$parseBM_FirstBit() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = peg$parseBM_BodyLine();\n    while (s3 !== peg$FAILED) {\n      s2.push(s3);\n      s3 = peg$parseBM_BodyLine();\n    }\n    s1 = input.substring(s1, peg$currPos);\n    peg$savedPos = s0;\n    s1 = peg$f1(s1);\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseBM_Bits() {\n    let s0, s1;\n\n    s0 = [];\n    s1 = peg$parseBM_NL_Bit();\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = peg$parseBM_NL_Bit();\n    }\n\n    return s0;\n  }\n\n  function peg$parseBM_NL_Bit() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseBlankLine();\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$parseBlankLine();\n    }\n    s2 = peg$parseNL();\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    s3 = peg$parseBM_Bit();\n    if (s3 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s0 = peg$f2(s3);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBM_Bit() {\n    let s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$currPos;\n    s3 = peg$parseBM_BitHeader();\n    if (s3 !== peg$FAILED) {\n      s4 = [];\n      s5 = peg$parseBM_BodyLine();\n      while (s5 !== peg$FAILED) {\n        s4.push(s5);\n        s5 = peg$parseBM_BodyLine();\n      }\n      s3 = [s3, s4];\n      s2 = s3;\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    if (s2 !== peg$FAILED) {\n      s1 = input.substring(s1, peg$currPos);\n    } else {\n      s1 = s2;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f3(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseBM_BitHeader() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c0) {\n      s1 = peg$c0;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e0); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      s3 = input.charAt(peg$currPos);\n      if (peg$r0.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n      while (s3 !== peg$FAILED) {\n        s2.push(s3);\n        s3 = input.charAt(peg$currPos);\n        if (peg$r0.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n      }\n      if (input.charCodeAt(peg$currPos) === 93) {\n        s3 = peg$c1;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e2); }\n      }\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f4(s1);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBM_BodyLine() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$parseNL();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      peg$silentFails++;\n      s3 = peg$parseBitHeader();\n      peg$silentFails--;\n      if (s3 === peg$FAILED) {\n        s2 = undefined;\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        s1 = [s1, s2];\n        s0 = s1;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = [];\n      s1 = peg$parseChar();\n      if (s1 !== peg$FAILED) {\n        while (s1 !== peg$FAILED) {\n          s0.push(s1);\n          s1 = peg$parseChar();\n        }\n      } else {\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parsebit() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseBlankLine();\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$parseBlankLine();\n    }\n    s2 = peg$parseBit();\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = peg$parseBlankLine();\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$parseBlankLine();\n      }\n      peg$savedPos = s0;\n      s0 = peg$f5(s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBit() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseBitHeader();\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseBitContent();\n      peg$savedPos = s0;\n      s0 = peg$f6(s1, s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = peg$currPos;\n      s2 = peg$parseAnything();\n      s1 = input.substring(s1, peg$currPos);\n      peg$savedPos = s0;\n      s1 = peg$f7(s1);\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBitHeader() {\n    let s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 91) {\n      s1 = peg$c2;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseBit_Level();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseBit_Value();\n        s4 = peg$parseTextFormatAndResourceType();\n        if (input.charCodeAt(peg$currPos) === 93) {\n          s5 = peg$c1;\n          peg$currPos++;\n        } else {\n          s5 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e2); }\n        }\n        if (s5 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f8(s2, s3, s4);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseTextFormatAndResourceType() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$parseTextFormat();\n    if (s1 === peg$FAILED) {\n      s1 = peg$parseResourceType();\n    }\n    if (s1 === peg$FAILED) {\n      s1 = null;\n    }\n    s2 = peg$parseTextFormat();\n    if (s2 === peg$FAILED) {\n      s2 = peg$parseResourceType();\n    }\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    peg$savedPos = s0;\n    s0 = peg$f9(s1, s2);\n\n    return s0;\n  }\n\n  function peg$parseTextFormat() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 58) {\n      s1 = peg$c3;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseBit_Value();\n      peg$savedPos = s0;\n      s0 = peg$f10(s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseResourceType() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 38) {\n      s1 = peg$c4;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e5); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseBit_Value();\n      peg$savedPos = s0;\n      s0 = peg$f11(s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseBitContent() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseDivider();\n    if (s2 === peg$FAILED) {\n      s2 = peg$parseCardSet_V2();\n      if (s2 === peg$FAILED) {\n        s2 = peg$parseCardSet_V1();\n        if (s2 === peg$FAILED) {\n          s2 = peg$parseTagChain();\n          if (s2 === peg$FAILED) {\n            s2 = peg$parseBodyChar();\n          }\n        }\n      }\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$parseDivider();\n      if (s2 === peg$FAILED) {\n        s2 = peg$parseCardSet_V2();\n        if (s2 === peg$FAILED) {\n          s2 = peg$parseCardSet_V1();\n          if (s2 === peg$FAILED) {\n            s2 = peg$parseTagChain();\n            if (s2 === peg$FAILED) {\n              s2 = peg$parseBodyChar();\n            }\n          }\n        }\n      }\n    }\n    peg$savedPos = s0;\n    s1 = peg$f12(s1);\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseTagChain() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$parseBitTag();\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = peg$parseChainedBitTag();\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$parseChainedBitTag();\n      }\n      s2 = [s2, s3];\n      s1 = s2;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f13(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseChainedBitTag() {\n    let s0, s1;\n\n    s0 = peg$currPos;\n    s1 = peg$parseBitTag();\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f14(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseBitTag() {\n    let s0, s1;\n\n    s0 = peg$currPos;\n    s1 = peg$parseIDTag();\n    if (s1 === peg$FAILED) {\n      s1 = peg$parsePropertyTag();\n      if (s1 === peg$FAILED) {\n        s1 = peg$parseTitleTag();\n        if (s1 === peg$FAILED) {\n          s1 = peg$parseAnchorTag();\n          if (s1 === peg$FAILED) {\n            s1 = peg$parseReferenceTag();\n            if (s1 === peg$FAILED) {\n              s1 = peg$parseItemLeadTag();\n              if (s1 === peg$FAILED) {\n                s1 = peg$parseInstructionTag();\n                if (s1 === peg$FAILED) {\n                  s1 = peg$parseHintTag();\n                  if (s1 === peg$FAILED) {\n                    s1 = peg$parseGapTag();\n                    if (s1 === peg$FAILED) {\n                      s1 = peg$parseMarkTag();\n                      if (s1 === peg$FAILED) {\n                        s1 = peg$parseSampleSolutionTag();\n                        if (s1 === peg$FAILED) {\n                          s1 = peg$parseTrueTag();\n                          if (s1 === peg$FAILED) {\n                            s1 = peg$parseFalseTag();\n                            if (s1 === peg$FAILED) {\n                              s1 = peg$parseResourceTag();\n                            }\n                          }\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f15(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseBodyChar() {\n    let s0, s1;\n\n    s0 = peg$currPos;\n    if (input.length > peg$currPos) {\n      s1 = input.charAt(peg$currPos);\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f16(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseDivider() {\n    let s0;\n\n    s0 = peg$parseFooterDivider();\n    if (s0 === peg$FAILED) {\n      s0 = peg$parsePlainTextDivider();\n    }\n\n    return s0;\n  }\n\n  function peg$parsePlainTextDividerText() {\n    let s0, s1, s2, s3, s4, s5;\n\n    if (input.substr(peg$currPos, 4) === peg$c5) {\n      s0 = peg$c5;\n      peg$currPos += 4;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e7); }\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 4) === peg$c6) {\n        s1 = peg$c6;\n        peg$currPos += 4;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e8); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = [];\n        s3 = peg$parseWS();\n        if (s3 !== peg$FAILED) {\n          while (s3 !== peg$FAILED) {\n            s2.push(s3);\n            s3 = peg$parseWS();\n          }\n        } else {\n          s2 = peg$FAILED;\n        }\n        if (s2 !== peg$FAILED) {\n          if (input.substr(peg$currPos, 4) === peg$c7) {\n            s3 = peg$c7;\n            peg$currPos += 4;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e9); }\n          }\n          if (s3 !== peg$FAILED) {\n            s4 = [];\n            s5 = peg$parseWS();\n            if (s5 !== peg$FAILED) {\n              while (s5 !== peg$FAILED) {\n                s4.push(s5);\n                s5 = peg$parseWS();\n              }\n            } else {\n              s4 = peg$FAILED;\n            }\n            if (s4 !== peg$FAILED) {\n              if (input.substr(peg$currPos, 4) === peg$c6) {\n                s5 = peg$c6;\n                peg$currPos += 4;\n              } else {\n                s5 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e8); }\n              }\n              if (s5 !== peg$FAILED) {\n                s1 = [s1, s2, s3, s4, s5];\n                s0 = s1;\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parsePlainTextDivider() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$parseNL();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parsePlainTextDividerText();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseWNL();\n        if (s4 !== peg$FAILED) {\n          s2 = [s2, s3, s4];\n          s1 = s2;\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f17(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseFooterDividerText() {\n    let s0, s1, s2, s3, s4, s5;\n\n    if (input.substr(peg$currPos, 4) === peg$c8) {\n      s0 = peg$c8;\n      peg$currPos += 4;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e10); }\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 4) === peg$c6) {\n        s1 = peg$c6;\n        peg$currPos += 4;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e8); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = [];\n        s3 = peg$parseWS();\n        if (s3 !== peg$FAILED) {\n          while (s3 !== peg$FAILED) {\n            s2.push(s3);\n            s3 = peg$parseWS();\n          }\n        } else {\n          s2 = peg$FAILED;\n        }\n        if (s2 !== peg$FAILED) {\n          if (input.substr(peg$currPos, 6) === peg$c9) {\n            s3 = peg$c9;\n            peg$currPos += 6;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e11); }\n          }\n          if (s3 !== peg$FAILED) {\n            s4 = [];\n            s5 = peg$parseWS();\n            if (s5 !== peg$FAILED) {\n              while (s5 !== peg$FAILED) {\n                s4.push(s5);\n                s5 = peg$parseWS();\n              }\n            } else {\n              s4 = peg$FAILED;\n            }\n            if (s4 !== peg$FAILED) {\n              if (input.substr(peg$currPos, 4) === peg$c6) {\n                s5 = peg$c6;\n                peg$currPos += 4;\n              } else {\n                s5 = peg$FAILED;\n                if (peg$silentFails === 0) { peg$fail(peg$e8); }\n              }\n              if (s5 !== peg$FAILED) {\n                s1 = [s1, s2, s3, s4, s5];\n                s0 = s1;\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseFooterDivider() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$parseNL();\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parseFooterDividerText();\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseWNL();\n        if (s4 !== peg$FAILED) {\n          s2 = [s2, s3, s4];\n          s1 = s2;\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f18(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseCardSet_V2() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$parseCardSetStart_V2();\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = peg$parseCards_V2();\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$parseCards_V2();\n      }\n      s4 = peg$parseCardSetEnd_V2();\n      if (s4 !== peg$FAILED) {\n        s2 = [s2, s3, s4];\n        s1 = s2;\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f19(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseCardSetStart_V2() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseWNL();\n    if (s2 === peg$FAILED) {\n      s2 = peg$parseNL();\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = peg$parseWNL();\n        if (s2 === peg$FAILED) {\n          s2 = peg$parseNL();\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      peg$silentFails++;\n      s3 = peg$parseCardDividerLookahead_V2();\n      peg$silentFails--;\n      if (s3 !== peg$FAILED) {\n        peg$currPos = s2;\n        s2 = undefined;\n      } else {\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f20();\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseCardSetEnd_V2() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$parseFooterDividerText();\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    s3 = peg$currPos;\n    peg$silentFails++;\n    s4 = peg$parseWEOL();\n    peg$silentFails--;\n    if (s4 !== peg$FAILED) {\n      peg$currPos = s3;\n      s3 = undefined;\n    } else {\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s2 = [s2, s3];\n      s1 = s2;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f21();\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseCards_V2() {\n    let s0, s1;\n\n    s0 = peg$currPos;\n    s1 = peg$parseCardLineOrDivider_V2();\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f22(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseCardLineOrDivider_V2() {\n    let s0, s1;\n\n    s0 = peg$currPos;\n    s1 = peg$parseCardDividerToken_V2();\n    if (s1 === peg$FAILED) {\n      s1 = peg$parseCardSideDividerToken_V2();\n      if (s1 === peg$FAILED) {\n        s1 = peg$parseCardVariantDividerToken_V2();\n        if (s1 === peg$FAILED) {\n          s1 = peg$parseCardLine_V2();\n        }\n      }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f23(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseCardDividerToken_V2() {\n    let s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 4) === peg$c6) {\n      s1 = peg$c6;\n      peg$currPos += 4;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    if (s1 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 32) {\n        s2 = peg$c10;\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e12); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseQualifier();\n        if (s3 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 32) {\n            s4 = peg$c10;\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e12); }\n          }\n          if (s4 !== peg$FAILED) {\n            if (input.substr(peg$currPos, 4) === peg$c6) {\n              s5 = peg$c6;\n              peg$currPos += 4;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e8); }\n            }\n            if (s5 !== peg$FAILED) {\n              s6 = peg$parseWNL();\n              if (s6 === peg$FAILED) {\n                s6 = peg$parseWEOL();\n              }\n              if (s6 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f24(s3);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 4) === peg$c6) {\n        s1 = peg$c6;\n        peg$currPos += 4;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e8); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parseWNL();\n        if (s2 === peg$FAILED) {\n          s2 = peg$parseWEOL();\n        }\n        if (s2 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f25();\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseCardSideDividerToken_V2() {\n    let s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c11) {\n      s1 = peg$c11;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e13); }\n    }\n    if (s1 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 32) {\n        s2 = peg$c10;\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e12); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseQualifier();\n        if (s3 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 32) {\n            s4 = peg$c10;\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e12); }\n          }\n          if (s4 !== peg$FAILED) {\n            if (input.substr(peg$currPos, 2) === peg$c11) {\n              s5 = peg$c11;\n              peg$currPos += 2;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e13); }\n            }\n            if (s5 !== peg$FAILED) {\n              s6 = peg$parseWNL();\n              if (s6 === peg$FAILED) {\n                s6 = peg$parseWEOL();\n              }\n              if (s6 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f26(s3);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 2) === peg$c11) {\n        s1 = peg$c11;\n        peg$currPos += 2;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e13); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parseWNL();\n        if (s2 === peg$FAILED) {\n          s2 = peg$parseWEOL();\n        }\n        if (s2 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f27();\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseCardVariantDividerToken_V2() {\n    let s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c12) {\n      s1 = peg$c12;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e14); }\n    }\n    if (s1 !== peg$FAILED) {\n      if (input.charCodeAt(peg$currPos) === 32) {\n        s2 = peg$c10;\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e12); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseQualifier();\n        if (s3 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 32) {\n            s4 = peg$c10;\n            peg$currPos++;\n          } else {\n            s4 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e12); }\n          }\n          if (s4 !== peg$FAILED) {\n            if (input.substr(peg$currPos, 2) === peg$c12) {\n              s5 = peg$c12;\n              peg$currPos += 2;\n            } else {\n              s5 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e14); }\n            }\n            if (s5 !== peg$FAILED) {\n              s6 = peg$parseWNL();\n              if (s6 === peg$FAILED) {\n                s6 = peg$parseWEOL();\n              }\n              if (s6 !== peg$FAILED) {\n                peg$savedPos = s0;\n                s0 = peg$f28(s3);\n              } else {\n                peg$currPos = s0;\n                s0 = peg$FAILED;\n              }\n            } else {\n              peg$currPos = s0;\n              s0 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      if (input.substr(peg$currPos, 2) === peg$c12) {\n        s1 = peg$c12;\n        peg$currPos += 2;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e14); }\n      }\n      if (s1 !== peg$FAILED) {\n        s2 = peg$parseWNL();\n        if (s2 === peg$FAILED) {\n          s2 = peg$parseWEOL();\n        }\n        if (s2 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f29();\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseCardDividerLookahead_V2() {\n    let s0, s1, s2, s3, s4, s5, s6;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 4) === peg$c6) {\n      s1 = peg$c6;\n      peg$currPos += 4;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e8); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      if (input.charCodeAt(peg$currPos) === 32) {\n        s3 = peg$c10;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e12); }\n      }\n      if (s3 !== peg$FAILED) {\n        s4 = peg$parseQualifier();\n        if (s4 !== peg$FAILED) {\n          if (input.charCodeAt(peg$currPos) === 32) {\n            s5 = peg$c10;\n            peg$currPos++;\n          } else {\n            s5 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e12); }\n          }\n          if (s5 !== peg$FAILED) {\n            if (input.substr(peg$currPos, 4) === peg$c6) {\n              s6 = peg$c6;\n              peg$currPos += 4;\n            } else {\n              s6 = peg$FAILED;\n              if (peg$silentFails === 0) { peg$fail(peg$e8); }\n            }\n            if (s6 !== peg$FAILED) {\n              s3 = [s3, s4, s5, s6];\n              s2 = s3;\n            } else {\n              peg$currPos = s2;\n              s2 = peg$FAILED;\n            }\n          } else {\n            peg$currPos = s2;\n            s2 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s2;\n          s2 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n      if (s2 === peg$FAILED) {\n        s2 = null;\n      }\n      s3 = peg$parseWNL();\n      if (s3 === peg$FAILED) {\n        s3 = peg$parseWEOL();\n      }\n      if (s3 !== peg$FAILED) {\n        s1 = [s1, s2, s3];\n        s0 = s1;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseCardLine_V2() {\n    let s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$currPos;\n    s3 = peg$parseFooterDividerText();\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parseWEOL();\n      if (s4 !== peg$FAILED) {\n        s3 = [s3, s4];\n        s2 = s3;\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    peg$silentFails--;\n    if (s2 === peg$FAILED) {\n      s1 = undefined;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = peg$currPos;\n      s4 = peg$parseLine();\n      s5 = peg$parseNL();\n      if (s5 !== peg$FAILED) {\n        s4 = [s4, s5];\n        s3 = s4;\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 === peg$FAILED) {\n        s3 = peg$currPos;\n        s4 = [];\n        s5 = peg$parseChar();\n        if (s5 !== peg$FAILED) {\n          while (s5 !== peg$FAILED) {\n            s4.push(s5);\n            s5 = peg$parseChar();\n          }\n        } else {\n          s4 = peg$FAILED;\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseEOL();\n          if (s5 !== peg$FAILED) {\n            s4 = [s4, s5];\n            s3 = s4;\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = input.substring(s2, peg$currPos);\n      } else {\n        s2 = s3;\n      }\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f30(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseCardSet_V1() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$parseCardSetStart_V1();\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = peg$parseCards_V1();\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = peg$parseCards_V1();\n      }\n      s4 = peg$parseCardSetEnd_V1();\n      if (s4 !== peg$FAILED) {\n        s2 = [s2, s3, s4];\n        s1 = s2;\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f31(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseCardSetStart_V1() {\n    let s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseWNL();\n    if (s2 === peg$FAILED) {\n      s2 = peg$parseNL();\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = peg$parseWNL();\n        if (s2 === peg$FAILED) {\n          s2 = peg$parseNL();\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      peg$silentFails++;\n      s3 = peg$currPos;\n      if (input.substr(peg$currPos, 3) === peg$c13) {\n        s4 = peg$c13;\n        peg$currPos += 3;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e15); }\n      }\n      if (s4 !== peg$FAILED) {\n        s5 = peg$parseWNL();\n        if (s5 !== peg$FAILED) {\n          s4 = [s4, s5];\n          s3 = s4;\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      peg$silentFails--;\n      if (s3 !== peg$FAILED) {\n        peg$currPos = s2;\n        s2 = undefined;\n      } else {\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f32();\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseCardSetEnd_V1() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = peg$parseFooterDividerText();\n    if (s2 === peg$FAILED) {\n      s2 = null;\n    }\n    s3 = peg$currPos;\n    peg$silentFails++;\n    s4 = peg$parseWEOL();\n    peg$silentFails--;\n    if (s4 !== peg$FAILED) {\n      peg$currPos = s3;\n      s3 = undefined;\n    } else {\n      s3 = peg$FAILED;\n    }\n    if (s3 !== peg$FAILED) {\n      s2 = [s2, s3];\n      s1 = s2;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f33();\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseCards_V1() {\n    let s0, s1;\n\n    s0 = peg$currPos;\n    s1 = peg$parseCardLineOrDivider_V1();\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f34(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseCardLineOrDivider_V1() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    if (input.substr(peg$currPos, 3) === peg$c13) {\n      s2 = peg$c13;\n      peg$currPos += 3;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e15); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = peg$parseWNL();\n      if (s3 === peg$FAILED) {\n        s3 = peg$parseWEOL();\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = [s2, s3];\n        s1 = s2;\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 === peg$FAILED) {\n      s1 = peg$currPos;\n      if (input.substr(peg$currPos, 2) === peg$c14) {\n        s2 = peg$c14;\n        peg$currPos += 2;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e16); }\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseWNL();\n        if (s3 === peg$FAILED) {\n          s3 = peg$parseWEOL();\n        }\n        if (s3 !== peg$FAILED) {\n          s2 = [s2, s3];\n          s1 = s2;\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s1;\n        s1 = peg$FAILED;\n      }\n      if (s1 === peg$FAILED) {\n        s1 = peg$currPos;\n        if (input.substr(peg$currPos, 2) === peg$c11) {\n          s2 = peg$c11;\n          peg$currPos += 2;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e13); }\n        }\n        if (s2 !== peg$FAILED) {\n          s3 = peg$parseWNL();\n          if (s3 === peg$FAILED) {\n            s3 = peg$parseWEOL();\n          }\n          if (s3 !== peg$FAILED) {\n            s2 = [s2, s3];\n            s1 = s2;\n          } else {\n            peg$currPos = s1;\n            s1 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s1;\n          s1 = peg$FAILED;\n        }\n        if (s1 === peg$FAILED) {\n          s1 = peg$parseCardLine_V1();\n        }\n      }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f35(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseCardLine_V1() {\n    let s0, s1, s2, s3, s4, s5;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    s2 = peg$currPos;\n    s3 = peg$parseFooterDividerText();\n    if (s3 !== peg$FAILED) {\n      s4 = peg$parseWEOL();\n      if (s4 !== peg$FAILED) {\n        s3 = [s3, s4];\n        s2 = s3;\n      } else {\n        peg$currPos = s2;\n        s2 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s2;\n      s2 = peg$FAILED;\n    }\n    peg$silentFails--;\n    if (s2 === peg$FAILED) {\n      s1 = undefined;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = peg$currPos;\n      s4 = peg$parseLine();\n      s5 = peg$parseNL();\n      if (s5 !== peg$FAILED) {\n        s4 = [s4, s5];\n        s3 = s4;\n      } else {\n        peg$currPos = s3;\n        s3 = peg$FAILED;\n      }\n      if (s3 === peg$FAILED) {\n        s3 = peg$currPos;\n        s4 = [];\n        s5 = peg$parseChar();\n        if (s5 !== peg$FAILED) {\n          while (s5 !== peg$FAILED) {\n            s4.push(s5);\n            s5 = peg$parseChar();\n          }\n        } else {\n          s4 = peg$FAILED;\n        }\n        if (s4 !== peg$FAILED) {\n          s5 = peg$parseEOL();\n          if (s5 !== peg$FAILED) {\n            s4 = [s4, s5];\n            s3 = s4;\n          } else {\n            peg$currPos = s3;\n            s3 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s3;\n          s3 = peg$FAILED;\n        }\n      }\n      if (s3 !== peg$FAILED) {\n        s2 = input.substring(s2, peg$currPos);\n      } else {\n        s2 = s3;\n      }\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f36(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseQualifier() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    if (input.substr(peg$currPos, 6) === peg$c9) {\n      s2 = peg$c9;\n      peg$currPos += 6;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e11); }\n    }\n    if (s2 === peg$FAILED) {\n      if (input.substr(peg$currPos, 4) === peg$c7) {\n        s2 = peg$c7;\n        peg$currPos += 4;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e9); }\n      }\n    }\n    peg$silentFails--;\n    if (s2 === peg$FAILED) {\n      s1 = undefined;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseQualifierName();\n      if (s2 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f37(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseQualifierName() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = input.charAt(peg$currPos);\n    if (peg$r1.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e17); }\n    }\n    if (s2 !== peg$FAILED) {\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r2.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e18); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r2.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e18); }\n        }\n      }\n      s2 = [s2, s3];\n      s1 = s2;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s0 = input.substring(s0, peg$currPos);\n    } else {\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parsecardContent() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = peg$parseTagChain();\n    if (s2 === peg$FAILED) {\n      s2 = peg$parseCardChar();\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = peg$parseTagChain();\n      if (s2 === peg$FAILED) {\n        s2 = peg$parseCardChar();\n      }\n    }\n    peg$savedPos = s0;\n    s1 = peg$f38(s1);\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseCardChar() {\n    let s0, s1;\n\n    s0 = peg$currPos;\n    if (input.length > peg$currPos) {\n      s1 = input.charAt(peg$currPos);\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f39(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseIDTag() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 4) === peg$c15) {\n      s1 = peg$c15;\n      peg$currPos += 4;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e19); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseKeyValueTag_Value();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseTag_Close();\n        if (s3 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f40(s2);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseTitleTag() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 91) {\n      s1 = peg$c2;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e3); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = [];\n      if (input.charCodeAt(peg$currPos) === 35) {\n        s3 = peg$c16;\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e20); }\n      }\n      if (s3 !== peg$FAILED) {\n        while (s3 !== peg$FAILED) {\n          s2.push(s3);\n          if (input.charCodeAt(peg$currPos) === 35) {\n            s3 = peg$c16;\n            peg$currPos++;\n          } else {\n            s3 = peg$FAILED;\n            if (peg$silentFails === 0) { peg$fail(peg$e20); }\n          }\n        }\n      } else {\n        s2 = peg$FAILED;\n      }\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseTag_Value();\n        s4 = peg$parseTag_CloseOrEOF();\n        if (s4 !== peg$FAILED) {\n          peg$savedPos = s0;\n          s0 = peg$f41(s2, s3);\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAnchorTag() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c17) {\n      s1 = peg$c17;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e21); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseTag_Value();\n      s3 = peg$parseTag_CloseOrEOF();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f42(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseReferenceTag() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c18) {\n      s1 = peg$c18;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e22); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseTag_Value();\n      s3 = peg$parseTag_CloseOrEOF();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f43(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parsePropertyTag() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c19) {\n      s1 = peg$c19;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e23); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseKeyValueTag_Key();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseKeyValueTag_Value();\n        if (s3 !== peg$FAILED) {\n          s4 = peg$parseTag_CloseOrEOF();\n          if (s4 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f44(s2, s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseItemLeadTag() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c20) {\n      s1 = peg$c20;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e24); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseTag_Value();\n      s3 = peg$parseTag_CloseOrEOF();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f45(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseInstructionTag() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c21) {\n      s1 = peg$c21;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e25); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseTag_Value();\n      s3 = peg$parseTag_CloseOrEOF();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f46(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseHintTag() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c22) {\n      s1 = peg$c22;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e26); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseTag_Value();\n      s3 = peg$parseTag_CloseOrEOF();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f47(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseTrueTag() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c23) {\n      s1 = peg$c23;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e27); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseTag_Value();\n      s3 = peg$parseTag_CloseOrEOF();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f48(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseFalseTag() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c24) {\n      s1 = peg$c24;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e28); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseTag_Value();\n      s3 = peg$parseTag_CloseOrEOF();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f49(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseSampleSolutionTag() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c25) {\n      s1 = peg$c25;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e29); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseTag_Value();\n      s3 = peg$parseTag_CloseOrEOF();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f50(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseGapTag() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c26) {\n      s1 = peg$c26;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e30); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseTag_Value();\n      s3 = peg$parseTag_CloseOrEOF();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f51(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseMarkTag() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c27) {\n      s1 = peg$c27;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e31); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseTag_Value();\n      s3 = peg$parseTag_CloseOrEOF();\n      if (s3 !== peg$FAILED) {\n        peg$savedPos = s0;\n        s0 = peg$f52(s2);\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseResourceTag() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    if (input.substr(peg$currPos, 2) === peg$c28) {\n      s1 = peg$c28;\n      peg$currPos += 2;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e32); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseKeyValueTag_Key();\n      if (s2 !== peg$FAILED) {\n        s3 = peg$parseKeyValueTag_Value();\n        if (s3 !== peg$FAILED) {\n          s4 = peg$parseTag_CloseOrEOF();\n          if (s4 !== peg$FAILED) {\n            peg$savedPos = s0;\n            s0 = peg$f53(s2, s3);\n          } else {\n            peg$currPos = s0;\n            s0 = peg$FAILED;\n          }\n        } else {\n          peg$currPos = s0;\n          s0 = peg$FAILED;\n        }\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseTag_Value() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    if (input.substr(peg$currPos, 2) === peg$c29) {\n      s3 = peg$c29;\n      peg$currPos += 2;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e33); }\n    }\n    if (s3 === peg$FAILED) {\n      s3 = input.charAt(peg$currPos);\n      if (peg$r0.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e1); }\n      }\n    }\n    while (s3 !== peg$FAILED) {\n      s2.push(s3);\n      if (input.substr(peg$currPos, 2) === peg$c29) {\n        s3 = peg$c29;\n        peg$currPos += 2;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e33); }\n      }\n      if (s3 === peg$FAILED) {\n        s3 = input.charAt(peg$currPos);\n        if (peg$r0.test(s3)) {\n          peg$currPos++;\n        } else {\n          s3 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e1); }\n        }\n      }\n    }\n    s1 = input.substring(s1, peg$currPos);\n    peg$savedPos = s0;\n    s1 = peg$f54(s1);\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseKeyValueTag_Key() {\n    let s0, s1, s2, s3, s4;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    peg$silentFails++;\n    if (input.substr(peg$currPos, 3) === peg$c30) {\n      s2 = peg$c30;\n      peg$currPos += 3;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e34); }\n    }\n    peg$silentFails--;\n    if (s2 === peg$FAILED) {\n      s1 = undefined;\n    } else {\n      peg$currPos = s1;\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$currPos;\n      s3 = [];\n      s4 = input.charAt(peg$currPos);\n      if (peg$r3.test(s4)) {\n        peg$currPos++;\n      } else {\n        s4 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e35); }\n      }\n      while (s4 !== peg$FAILED) {\n        s3.push(s4);\n        s4 = input.charAt(peg$currPos);\n        if (peg$r3.test(s4)) {\n          peg$currPos++;\n        } else {\n          s4 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e35); }\n        }\n      }\n      s2 = input.substring(s2, peg$currPos);\n      peg$savedPos = s0;\n      s0 = peg$f55(s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n  function peg$parseTag_Close() {\n    let s0;\n\n    if (input.charCodeAt(peg$currPos) === 93) {\n      s0 = peg$c1;\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseTag_CloseOrEOF() {\n    let s0, s1, s2;\n\n    if (input.charCodeAt(peg$currPos) === 93) {\n      s0 = peg$c1;\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e2); }\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = [];\n      s2 = peg$parseWS();\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        s2 = peg$parseWS();\n      }\n      s2 = peg$parseEOF();\n      if (s2 !== peg$FAILED) {\n        s1 = [s1, s2];\n        s0 = s1;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseBit_Level() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    s1 = [];\n    if (input.charCodeAt(peg$currPos) === 46) {\n      s2 = peg$c31;\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e36); }\n    }\n    if (s2 !== peg$FAILED) {\n      while (s2 !== peg$FAILED) {\n        s1.push(s2);\n        if (input.charCodeAt(peg$currPos) === 46) {\n          s2 = peg$c31;\n          peg$currPos++;\n        } else {\n          s2 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e36); }\n        }\n      }\n    } else {\n      s1 = peg$FAILED;\n    }\n    if (s1 !== peg$FAILED) {\n      peg$savedPos = s0;\n      s1 = peg$f56(s1);\n    }\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseBit_Value() {\n    let s0, s1, s2, s3;\n\n    s0 = peg$currPos;\n    s1 = peg$currPos;\n    s2 = [];\n    s3 = input.charAt(peg$currPos);\n    if (peg$r4.test(s3)) {\n      peg$currPos++;\n    } else {\n      s3 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e37); }\n    }\n    while (s3 !== peg$FAILED) {\n      s2.push(s3);\n      s3 = input.charAt(peg$currPos);\n      if (peg$r4.test(s3)) {\n        peg$currPos++;\n      } else {\n        s3 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e37); }\n      }\n    }\n    s1 = input.substring(s1, peg$currPos);\n    peg$savedPos = s0;\n    s1 = peg$f57(s1);\n    s0 = s1;\n\n    return s0;\n  }\n\n  function peg$parseKeyValueTag_Value() {\n    let s0, s1, s2;\n\n    s0 = peg$currPos;\n    if (input.charCodeAt(peg$currPos) === 58) {\n      s1 = peg$c3;\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e4); }\n    }\n    if (s1 !== peg$FAILED) {\n      s2 = peg$parseTag_Value();\n      peg$savedPos = s0;\n      s0 = peg$f58(s2);\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      s1 = '';\n      peg$savedPos = s0;\n      s1 = peg$f59();\n      s0 = s1;\n    }\n\n    return s0;\n  }\n\n  function peg$parseAnything() {\n    let s0, s1;\n\n    peg$silentFails++;\n    s0 = [];\n    if (input.length > peg$currPos) {\n      s1 = input.charAt(peg$currPos);\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e6); }\n      }\n    }\n    peg$silentFails--;\n\n    return s0;\n  }\n\n  function peg$parseChar() {\n    let s0, s1;\n\n    peg$silentFails++;\n    s0 = input.charAt(peg$currPos);\n    if (peg$r5.test(s0)) {\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e39); }\n    }\n    peg$silentFails--;\n    if (s0 === peg$FAILED) {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e38); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseLine() {\n    let s0, s1;\n\n    peg$silentFails++;\n    s0 = [];\n    s1 = peg$parseChar();\n    while (s1 !== peg$FAILED) {\n      s0.push(s1);\n      s1 = peg$parseChar();\n    }\n    peg$silentFails--;\n\n    return s0;\n  }\n\n  function peg$parseBlankLine() {\n    let s0, s1, s2;\n\n    peg$silentFails++;\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r6.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e41); }\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = input.charAt(peg$currPos);\n      if (peg$r6.test(s2)) {\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e41); }\n      }\n    }\n    s2 = peg$parseNL();\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    peg$silentFails--;\n    if (s0 === peg$FAILED) {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e40); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseNL() {\n    let s0, s1;\n\n    peg$silentFails++;\n    if (input.charCodeAt(peg$currPos) === 10) {\n      s0 = peg$c32;\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e43); }\n    }\n    if (s0 === peg$FAILED) {\n      if (input.substr(peg$currPos, 2) === peg$c33) {\n        s0 = peg$c33;\n        peg$currPos += 2;\n      } else {\n        s0 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e44); }\n      }\n      if (s0 === peg$FAILED) {\n        s0 = input.charAt(peg$currPos);\n        if (peg$r7.test(s0)) {\n          peg$currPos++;\n        } else {\n          s0 = peg$FAILED;\n          if (peg$silentFails === 0) { peg$fail(peg$e45); }\n        }\n      }\n    }\n    peg$silentFails--;\n    if (s0 === peg$FAILED) {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e42); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseWNL() {\n    let s0, s1, s2;\n\n    peg$silentFails++;\n    s0 = peg$currPos;\n    s1 = [];\n    s2 = input.charAt(peg$currPos);\n    if (peg$r6.test(s2)) {\n      peg$currPos++;\n    } else {\n      s2 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e41); }\n    }\n    while (s2 !== peg$FAILED) {\n      s1.push(s2);\n      s2 = input.charAt(peg$currPos);\n      if (peg$r6.test(s2)) {\n        peg$currPos++;\n      } else {\n        s2 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e41); }\n      }\n    }\n    s2 = peg$parseNL();\n    if (s2 !== peg$FAILED) {\n      s1 = [s1, s2];\n      s0 = s1;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n    peg$silentFails--;\n    if (s0 === peg$FAILED) {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e46); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseWS() {\n    let s0, s1;\n\n    peg$silentFails++;\n    s0 = input.charAt(peg$currPos);\n    if (peg$r8.test(s0)) {\n      peg$currPos++;\n    } else {\n      s0 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e48); }\n    }\n    peg$silentFails--;\n    if (s0 === peg$FAILED) {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e47); }\n    }\n\n    return s0;\n  }\n\n  function peg$parseEOL() {\n    let s0, s1;\n\n    s0 = peg$parseNL();\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e6); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseWEOL() {\n    let s0, s1;\n\n    s0 = peg$parseWNL();\n    if (s0 === peg$FAILED) {\n      s0 = peg$currPos;\n      peg$silentFails++;\n      if (input.length > peg$currPos) {\n        s1 = input.charAt(peg$currPos);\n        peg$currPos++;\n      } else {\n        s1 = peg$FAILED;\n        if (peg$silentFails === 0) { peg$fail(peg$e6); }\n      }\n      peg$silentFails--;\n      if (s1 === peg$FAILED) {\n        s0 = undefined;\n      } else {\n        peg$currPos = s0;\n        s0 = peg$FAILED;\n      }\n    }\n\n    return s0;\n  }\n\n  function peg$parseEOF() {\n    let s0, s1;\n\n    s0 = peg$currPos;\n    peg$silentFails++;\n    if (input.length > peg$currPos) {\n      s1 = input.charAt(peg$currPos);\n      peg$currPos++;\n    } else {\n      s1 = peg$FAILED;\n      if (peg$silentFails === 0) { peg$fail(peg$e6); }\n    }\n    peg$silentFails--;\n    if (s1 === peg$FAILED) {\n      s0 = undefined;\n    } else {\n      peg$currPos = s0;\n      s0 = peg$FAILED;\n    }\n\n    return s0;\n  }\n\n // PER PARSE JS\n\n//\n// Instance variables\n//\n\n// Create the helper instance (low-level helper functions)\nconst helper = new BitmarkPegParserHelper({\n  parse: peg$parse,\n  parserText: text,\n  parserLocation,\n\n});\n\n// Create the processor instance (semantic processor)\nconst processor = new BitmarkPegParserProcessor({\n  parse: peg$parse,\n  parserText: text,\n  parserLocation,\n});\n\n// Function to remove 'source' from Location object\nfunction parserLocation() {\n  const l = location();\n  if (!l) return l;\n  delete l.source;\n\n  return l;\n}\n\n// Override peg$computeLocation to force the offset flag when computing location\n// (unfortunately not possible in Peggy yet).\nfunction peg$computeLocation(startPos, endPos, offset) {\n  offset = true;\n  var startPosDetails = peg$computePosDetails(startPos);\n  var endPosDetails = peg$computePosDetails(endPos);\n\n  var res = {\n    source: peg$source,\n    start: {\n      offset: startPos,\n      line: startPosDetails.line,\n      column: startPosDetails.column\n    },\n    end: {\n      offset: endPos,\n      line: endPosDetails.line,\n      column: endPosDetails.column\n    }\n  };\n  if (offset && peg$source && (typeof peg$source.offset === \"function\")) {\n    res.start = peg$source.offset(res.start);\n    res.end = peg$source.offset(res.end);\n  }\n  return res;\n}\n\n\n  peg$result = peg$startRuleFunction();\n\n  const peg$success = (peg$result !== peg$FAILED && peg$currPos === input.length);\n  function peg$throw() {\n    if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n      peg$fail(peg$endExpectation());\n    }\n\n    throw peg$buildStructuredError(\n      peg$maxFailExpected,\n      peg$maxFailPos < input.length ? peg$getUnicode(peg$maxFailPos) : null,\n      peg$maxFailPos < input.length\n        ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n        : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n    );\n  }\n  if (options.peg$library) {\n    return /** @type {any} */ ({\n      peg$result,\n      peg$currPos,\n      peg$FAILED,\n      peg$maxFailExpected,\n      peg$maxFailPos,\n      peg$success,\n      peg$throw: peg$success ? undefined : peg$throw,\n    });\n  }\n  if (peg$success) {\n    return peg$result;\n  } else {\n    peg$throw();\n  }\n}\n\nconst peg$allowedStartRules = [\n  \"bitmark\",\n  \"bit\",\n  \"cardContent\"\n];\n\nexport {\n  peg$allowedStartRules as StartRules,\n  peg$SyntaxError as SyntaxError,\n  peg$parse as parse\n};\n\n// grammar-sha256: 03c2833a1c24a67810d25251ca3e6463a189e97ae59dfe673723647263a5a087\n","import { parse as _parse } from '../../../generated/parser/bitmark/bitmark-peggy-parser.js';\nimport { type BitmarkAst } from '../../../model/ast/Nodes.ts';\n\ninterface ParseOptions {\n  startRule?: string;\n}\ntype Parse = (str: string, options?: ParseOptions) => BitmarkAst;\n\nconst parse: Parse = _parse;\n\nexport { parse };\n","import { type BitmarkAst } from '../../model/ast/Nodes.ts';\nimport { type BitmarkParserTypeType } from '../../model/enum/BitmarkParserType.ts';\nimport { JsonParser } from '../json/JsonParser.ts';\nimport { parse as bitmarkParse } from './peg/BitmarkPegParser.ts';\n\nexport interface BitmarkParserOptions {\n  parserType?: BitmarkParserTypeType;\n}\n\nclass BitmarkParser {\n  protected jsonParser = new JsonParser();\n\n  /**\n   * Convert Bitmark markup to AST.\n   *\n   * The Bitmark markup should be a string.\n   *\n   * @param json - bitmark JSON as a string or a plain JS object\n   * @param _options - unused\n   * @returns bitmark AST\n   */\n  toAst(bitmark: string, _options?: BitmarkParserOptions): BitmarkAst {\n    // const opts = Object.assign({}, options);\n\n    return bitmarkParse(bitmark);\n  }\n}\n\nexport { BitmarkParser };\n","/**\n * Minimal, dependency-free HTML tokenizer + tree builder.\n *\n * This is NOT a full HTML5 parser. It recognises just enough structure to extract HTML tables\n * and their cell content (the tags required by {@link HtmlTableParser}). It is intentionally\n * lenient: it never throws on malformed markup and applies a small set of implied end-tag rules\n * so that common real-world (unclosed `<td>`, `<tr>`, `<li>`, `<p>`) markup parses sensibly.\n *\n * Works in both Node and browser (no DOM, no `fs`, no external dependencies).\n */\n\nexport interface HtmlElement {\n  type: 'element';\n  /** Lower-cased tag name */\n  name: string;\n  attrs: Record<string, string>;\n  children: HtmlNode[];\n}\n\nexport interface HtmlText {\n  type: 'text';\n  /** Raw text (HTML entities NOT decoded here) */\n  value: string;\n}\n\nexport type HtmlNode = HtmlElement | HtmlText;\n\nconst VOID_ELEMENTS = new Set([\n  'area',\n  'base',\n  'br',\n  'col',\n  'embed',\n  'hr',\n  'img',\n  'input',\n  'link',\n  'meta',\n  'param',\n  'source',\n  'track',\n  'wbr',\n]);\n\n/**\n * Implied end tags: opening a `key` tag auto-closes any currently-open tag whose name is in the\n * associated set (popping them off the stack first). Mirrors browser behaviour loosely without a\n * full tree-construction algorithm.\n */\nconst IMPLIED_CLOSE: Record<string, Set<string>> = {\n  li: new Set(['li']),\n  td: new Set(['td', 'th']),\n  th: new Set(['td', 'th']),\n  tr: new Set(['td', 'th', 'tr']),\n  thead: new Set(['td', 'th', 'tr', 'thead', 'tbody', 'tfoot']),\n  tbody: new Set(['td', 'th', 'tr', 'thead', 'tbody', 'tfoot']),\n  tfoot: new Set(['td', 'th', 'tr', 'thead', 'tbody', 'tfoot']),\n  p: new Set(['p']),\n  option: new Set(['option']),\n};\n\n// Matches an opening or closing tag, tolerating quoted attribute values that contain `>`.\nconst TAG_RE = /<(\\/)?([a-zA-Z][a-zA-Z0-9:-]*)((?:\\s+(?:\"[^\"]*\"|'[^']*'|[^<>\"'])*)?)(\\/)?>/g;\n\n// Matches a single attribute: name plus optional (quoted/unquoted) value.\nconst ATTR_RE = /([a-zA-Z_:][a-zA-Z0-9:._-]*)(?:\\s*=\\s*(\"[^\"]*\"|'[^']*'|[^\\s\"'>]+))?/g;\n\ninterface Token {\n  kind: 'open' | 'close' | 'text';\n  name?: string;\n  attrs?: Record<string, string>;\n  selfClose?: boolean;\n  text?: string;\n}\n\nfunction parseAttrs(raw: string): Record<string, string> {\n  const attrs: Record<string, string> = {};\n  if (!raw) return attrs;\n\n  ATTR_RE.lastIndex = 0;\n  let m: RegExpExecArray | null;\n  while ((m = ATTR_RE.exec(raw)) !== null) {\n    const name = m[1].toLowerCase();\n    let value = m[2] ?? '';\n    if (value.length >= 2 && (value[0] === '\"' || value[0] === \"'\")) {\n      value = value.slice(1, -1);\n    }\n    attrs[name] = value;\n  }\n  return attrs;\n}\n\n/**\n * Remove markup that must never contribute to extracted content.\n */\nfunction stripNonContent(html: string): string {\n  return html\n    .replace(/<!--[\\s\\S]*?-->/g, '')\n    .replace(/<!\\[CDATA\\[[\\s\\S]*?\\]\\]>/g, '')\n    .replace(/<!doctype[^>]*>/gi, '')\n    .replace(/<script\\b[\\s\\S]*?<\\/script>/gi, '')\n    .replace(/<style\\b[\\s\\S]*?<\\/style>/gi, '');\n}\n\nfunction tokenize(html: string): Token[] {\n  const tokens: Token[] = [];\n  const clean = stripNonContent(html);\n\n  TAG_RE.lastIndex = 0;\n  let lastIndex = 0;\n  let m: RegExpExecArray | null;\n  while ((m = TAG_RE.exec(clean)) !== null) {\n    if (m.index > lastIndex) {\n      tokens.push({ kind: 'text', text: clean.slice(lastIndex, m.index) });\n    }\n    lastIndex = TAG_RE.lastIndex;\n\n    const isClose = m[1] === '/';\n    const name = m[2].toLowerCase();\n    if (isClose) {\n      tokens.push({ kind: 'close', name });\n    } else {\n      tokens.push({\n        kind: 'open',\n        name,\n        attrs: parseAttrs(m[3]),\n        selfClose: m[4] === '/',\n      });\n    }\n  }\n  if (lastIndex < clean.length) {\n    tokens.push({ kind: 'text', text: clean.slice(lastIndex) });\n  }\n  return tokens;\n}\n\n/**\n * Parse an HTML string into a lightweight node tree.\n * @returns the top-level child nodes (document fragment).\n */\nexport function parseHtml(html: string): HtmlNode[] {\n  const root: HtmlElement = { type: 'element', name: '#root', attrs: {}, children: [] };\n  const stack: HtmlElement[] = [root];\n  const top = (): HtmlElement => stack[stack.length - 1];\n\n  for (const token of tokenize(html)) {\n    if (token.kind === 'text') {\n      if (token.text) top().children.push({ type: 'text', value: token.text });\n      continue;\n    }\n\n    if (token.kind === 'open') {\n      const name = token.name as string;\n\n      // Apply implied end-tags\n      const closes = IMPLIED_CLOSE[name];\n      if (closes) {\n        while (stack.length > 1 && closes.has(top().name)) stack.pop();\n      }\n\n      const el: HtmlElement = {\n        type: 'element',\n        name,\n        attrs: token.attrs ?? {},\n        children: [],\n      };\n      top().children.push(el);\n\n      if (!token.selfClose && !VOID_ELEMENTS.has(name)) {\n        stack.push(el);\n      }\n      continue;\n    }\n\n    // close tag: pop down to (and including) the nearest matching open element\n    for (let i = stack.length - 1; i > 0; i--) {\n      if (stack[i].name === token.name) {\n        stack.length = i;\n        break;\n      }\n    }\n  }\n\n  return root.children;\n}\n\n/** Get the first direct child element with the given tag name. */\nexport function firstChildElement(el: HtmlElement, name: string): HtmlElement | undefined {\n  return el.children.find((c): c is HtmlElement => c.type === 'element' && c.name === name);\n}\n\n/** Get all direct child elements whose name is in the given set. */\nexport function childElements(el: HtmlElement, names: Set<string>): HtmlElement[] {\n  return el.children.filter((c): c is HtmlElement => c.type === 'element' && names.has(c.name));\n}\n","/**\n * Extract HTML tables and convert them into bitmark table bit-JSON.\n *\n * Produces an array of bare `BitJson`-shaped objects (`type` = `table-extended` or `table`) that\n * can be fed directly into the existing JSON → AST → output pipeline. Cell content is built as\n * `TextAst` (rich text nodes) directly; the downstream generators handle serialisation and\n * breakscaping.\n *\n * See PLAN-013 for the full specification.\n */\n\nimport type { TextAst, TextMark, TextNode } from '../../model/ast/TextNodes.ts';\nimport type {\n  TableCellJson,\n  TableExtendedJson,\n  TableJson,\n  TableRowJson,\n} from '../../model/json/BitJson.ts';\nimport { convertExtendedToBasicTableFormat } from '../json/TableUtils.ts';\nimport { childElements, type HtmlElement, type HtmlNode, parseHtml } from './HtmlDom.ts';\n\nexport type HtmlTableFormat = 'table' | 'table-extended';\n\nexport interface HtmlTableParseOptions {\n  /** Output bit type. Default `table-extended` (lossless). `table` is lossy. */\n  tableFormat?: HtmlTableFormat;\n  /** Keep unmappable tags as literal text instead of unwrapping them. Default false. */\n  keepUnknownTags?: boolean;\n  /** Called with a human-readable message when information is lost (e.g. lossy `table` output). */\n  onWarning?: (message: string) => void;\n}\n\n/** Loosely-typed table bit JSON (matches a subset of BitJson). */\nexport interface TableBitJson {\n  type: HtmlTableFormat;\n  format: 'bitmark++';\n  caption?: TextAst;\n  table: TableJson | TableExtendedJson;\n}\n\n// HTML inline tag -> bitmark TextMarkType value\nconst MARK_TAGS: Record<string, string> = {\n  b: 'bold',\n  strong: 'bold',\n  i: 'italic',\n  em: 'italic',\n  sup: 'superscript',\n  sub: 'subscript',\n  s: 'strike',\n  strike: 'strike',\n  del: 'del',\n  ins: 'ins',\n  u: 'underline',\n  mark: 'highlight',\n  code: 'code',\n};\n\nconst SECTION_TAGS = new Set(['thead', 'tbody', 'tfoot']);\nconst ROW_TAGS = new Set(['tr']);\nconst CELL_TAGS = new Set(['td', 'th']);\nconst LI_TAGS = new Set(['li']);\nconst VALID_SCOPES = new Set(['row', 'col', 'rowgroup', 'colgroup']);\n\nconst NAMED_ENTITIES: Record<string, string> = {\n  amp: '&',\n  lt: '<',\n  gt: '>',\n  quot: '\"',\n  apos: \"'\",\n  nbsp: ' ',\n};\n\nfunction decodeEntities(text: string): string {\n  return text.replace(/&(#x?[0-9a-fA-F]+|[a-zA-Z][a-zA-Z0-9]*);/g, (whole, body: string) => {\n    if (body[0] === '#') {\n      const code =\n        body[1] === 'x' || body[1] === 'X'\n          ? Number.parseInt(body.slice(2), 16)\n          : Number.parseInt(body.slice(1), 10);\n      if (Number.isFinite(code) && code >= 0 && code <= 0x10ffff) {\n        try {\n          return String.fromCodePoint(code);\n        } catch {\n          return whole;\n        }\n      }\n      return whole;\n    }\n    return NAMED_ENTITIES[body] ?? whole;\n  });\n}\n\nfunction intAttr(value: string | undefined): number | undefined {\n  if (value == null) return undefined;\n  const n = Number.parseInt(value, 10);\n  return Number.isInteger(n) ? n : undefined;\n}\n\nfunction isElement(node: HtmlNode): node is HtmlElement {\n  return node.type === 'element';\n}\n\nexport class HtmlTableParser {\n  private keepUnknownTags = false;\n\n  /**\n   * Parse an HTML string and return one table bit per top-level `<table>`.\n   */\n  parse(html: string, options?: HtmlTableParseOptions): TableBitJson[] {\n    this.keepUnknownTags = options?.keepUnknownTags ?? false;\n    const tableFormat: HtmlTableFormat = options?.tableFormat ?? 'table-extended';\n    const onWarning = options?.onWarning;\n\n    const tables = this.collectTopLevelTables(parseHtml(html));\n    const bits: TableBitJson[] = [];\n\n    for (const table of tables) {\n      const bit = this.tableToBit(table, tableFormat, onWarning);\n      if (bit) bits.push(bit);\n    }\n\n    return bits;\n  }\n\n  // --- table extraction -----------------------------------------------------\n\n  /** Collect every `<table>` element, NOT descending into nested tables. */\n  private collectTopLevelTables(nodes: HtmlNode[]): HtmlElement[] {\n    const tables: HtmlElement[] = [];\n    const visit = (node: HtmlNode): void => {\n      if (!isElement(node)) return;\n      if (node.name === 'table') {\n        tables.push(node);\n        return; // do not recurse into nested tables\n      }\n      node.children.forEach(visit);\n    };\n    nodes.forEach(visit);\n    return tables;\n  }\n\n  private tableToBit(\n    table: HtmlElement,\n    tableFormat: HtmlTableFormat,\n    onWarning?: (message: string) => void,\n  ): TableBitJson | undefined {\n    const header: TableRowJson[] = [];\n    const body: TableRowJson[] = [];\n    const footer: TableRowJson[] = [];\n\n    let caption: TextAst | undefined;\n\n    for (const child of table.children) {\n      if (!isElement(child)) continue;\n\n      if (child.name === 'caption') {\n        const capContent = this.inlineNodes(child.children, []);\n        const trimmed = this.trimInline(capContent);\n        if (trimmed.length > 0) caption = trimmed;\n      } else if (SECTION_TAGS.has(child.name)) {\n        const target = child.name === 'thead' ? header : child.name === 'tfoot' ? footer : body;\n        for (const tr of childElements(child, ROW_TAGS)) {\n          target.push(this.rowToCells(tr));\n        }\n      } else if (ROW_TAGS.has(child.name)) {\n        body.push(this.rowToCells(child));\n      }\n      // colgroup / col and other elements are ignored\n    }\n\n    if (header.length === 0 && body.length === 0 && footer.length === 0) {\n      return undefined; // skip zero-row tables\n    }\n\n    const tableExtended: TableExtendedJson = {};\n    if (header.length > 0) tableExtended.header = { rows: header };\n    if (body.length > 0) tableExtended.body = { rows: body };\n    if (footer.length > 0) tableExtended.footer = { rows: footer };\n\n    let tableData: TableJson | TableExtendedJson = tableExtended;\n\n    if (tableFormat === 'table') {\n      if (this.isLossyAsBasic(tableExtended)) {\n        onWarning?.(\n          'Converting an HTML table to [.table] loses rowspan/colspan/scope and multi-section ' +\n            'structure; use --tableFormat table-extended to preserve them.',\n        );\n      }\n      tableData = convertExtendedToBasicTableFormat(tableExtended);\n    }\n\n    const bit: TableBitJson = {\n      type: tableFormat,\n      format: 'bitmark++',\n      table: tableData,\n    };\n    if (caption) bit.caption = caption;\n    return bit;\n  }\n\n  private rowToCells(tr: HtmlElement): TableRowJson {\n    const cells: TableCellJson[] = [];\n    for (const cell of childElements(tr, CELL_TAGS)) {\n      cells.push(this.cellToJson(cell));\n    }\n    return { cells };\n  }\n\n  private cellToJson(cell: HtmlElement): TableCellJson {\n    const json: TableCellJson = {\n      content: this.blockNodes(cell.children),\n    };\n\n    if (cell.name === 'th') json.title = true;\n\n    const rowspan = intAttr(cell.attrs.rowspan);\n    if (rowspan != null && rowspan >= 2) json.rowspan = rowspan;\n\n    const colspan = intAttr(cell.attrs.colspan);\n    if (colspan != null && colspan >= 2) json.colspan = colspan;\n\n    const scope = cell.attrs.scope?.toLowerCase();\n    if (scope && VALID_SCOPES.has(scope)) {\n      json.scope = scope as TableCellJson['scope'];\n    }\n\n    const width = this.widthFromCell(cell);\n    if (width != null) json.colwidth = width;\n\n    return json;\n  }\n\n  private widthFromCell(cell: HtmlElement): number | undefined {\n    const attrWidth = intAttr(cell.attrs.width);\n    if (attrWidth != null && attrWidth > 0) return attrWidth;\n\n    const style = cell.attrs.style;\n    if (style) {\n      const m = style.match(/width\\s*:\\s*(\\d+)\\s*px/i);\n      if (m) {\n        const n = Number.parseInt(m[1], 10);\n        if (Number.isInteger(n) && n > 0) return n;\n      }\n    }\n    return undefined;\n  }\n\n  private isLossyAsBasic(table: TableExtendedJson): boolean {\n    if (table.footer) return true;\n    if (table.header && table.header.rows.length > 1) return true;\n    const sections = [table.header, table.body, table.footer];\n    for (const section of sections) {\n      if (!section) continue;\n      for (const row of section.rows) {\n        for (const cell of row.cells) {\n          if (cell.rowspan || cell.colspan || cell.scope) return true;\n        }\n      }\n    }\n    return false;\n  }\n\n  // --- content conversion (HTML -> TextAst) ---------------------------------\n\n  /**\n   * Convert a cell/li's child nodes into block-level TextAst nodes (paragraphs, lists, images).\n   */\n  private blockNodes(nodes: HtmlNode[]): TextAst {\n    const blocks: TextNode[] = [];\n    let inline: TextNode[] = [];\n\n    const flush = (): void => {\n      const trimmed = this.trimInline(inline);\n      inline = [];\n      if (trimmed.length === 0) return;\n      // A paragraph that is just a single inline image becomes a block image.\n      if (trimmed.length === 1 && trimmed[0].type === 'imageInline') {\n        blocks.push({ ...trimmed[0], type: 'image' } as unknown as TextNode);\n      } else {\n        blocks.push({ type: 'paragraph', content: trimmed, attrs: {} } as unknown as TextNode);\n      }\n    };\n\n    for (const node of nodes) {\n      if (!isElement(node)) {\n        inline.push(...this.inlineText(node.value, []));\n        continue;\n      }\n\n      const name = node.name;\n      if (name === 'p') {\n        flush();\n        const content = this.trimInline(this.inlineNodes(node.children, []));\n        if (content.length > 0) {\n          blocks.push({ type: 'paragraph', content, attrs: {} } as unknown as TextNode);\n        }\n      } else if (this.isListTag(name)) {\n        flush();\n        const list = this.listNode(node);\n        if (list) blocks.push(list);\n      } else {\n        // inline content (marks, links, br, img) or unknown tags -> inline buffer\n        inline.push(...this.inlineFromElement(node, []));\n      }\n    }\n    flush();\n\n    return blocks;\n  }\n\n  /** Convert child nodes to a flat list of inline TextNodes, applying the given marks. */\n  private inlineNodes(nodes: HtmlNode[], marks: TextMark[]): TextNode[] {\n    const out: TextNode[] = [];\n    for (const node of nodes) {\n      if (!isElement(node)) {\n        out.push(...this.inlineText(node.value, marks));\n      } else {\n        out.push(...this.inlineFromElement(node, marks));\n      }\n    }\n    return out;\n  }\n\n  private inlineFromElement(el: HtmlElement, marks: TextMark[]): TextNode[] {\n    const name = el.name;\n\n    if (name === 'br') {\n      return [{ type: 'hardBreak' } as unknown as TextNode];\n    }\n\n    if (name === 'img') {\n      return [this.imageNode(el, true)];\n    }\n\n    if (this.isMathTag(name)) {\n      return [this.latexNode(el)];\n    }\n\n    const markType = MARK_TAGS[name];\n    if (markType) {\n      return this.inlineNodes(el.children, [...marks, { type: markType } as TextMark]);\n    }\n\n    if (name === 'a') {\n      const linkMark = {\n        type: 'link',\n        attrs: {\n          href: el.attrs.href ?? '',\n          ...(el.attrs.target ? { target: el.attrs.target } : {}),\n        },\n      } as unknown as TextMark;\n      return this.inlineNodes(el.children, [...marks, linkMark]);\n    }\n\n    // Unknown tag\n    if (this.keepUnknownTags) {\n      const open = this.serializeOpenTag(el);\n      const close = `</${name}>`;\n      return [\n        ...this.inlineText(open, marks),\n        ...this.inlineNodes(el.children, marks),\n        ...this.inlineText(close, marks),\n      ];\n    }\n\n    // Default: unwrap (drop the tag, keep inner content)\n    return this.inlineNodes(el.children, marks);\n  }\n\n  private inlineText(raw: string, marks: TextMark[]): TextNode[] {\n    // Collapse runs of whitespace to a single space (HTML-standard).\n    const text = decodeEntities(raw).replace(/\\s+/g, ' ');\n    if (text === '') return [];\n    const node: TextNode = { text, type: 'text' };\n    if (marks.length > 0) node.marks = marks.map((m) => ({ ...m }));\n    return [node];\n  }\n\n  private serializeOpenTag(el: HtmlElement): string {\n    const attrs = Object.entries(el.attrs)\n      .map(([k, v]) => (v === '' ? ` ${k}` : ` ${k}=\"${v}\"`))\n      .join('');\n    return `<${el.name}${attrs}>`;\n  }\n\n  // --- lists ----------------------------------------------------------------\n\n  private isListTag(name: string): boolean {\n    return name === 'ul' || name === 'ol';\n  }\n\n  private listNode(el: HtmlElement): TextNode | undefined {\n    const items = childElements(el, LI_TAGS);\n    if (items.length === 0) return undefined;\n\n    const isTask =\n      el.name === 'ul' &&\n      items.some((li) => {\n        const firstEl = li.children.find(isElement);\n        return firstEl?.name === 'input' && firstEl.attrs.type?.toLowerCase() === 'checkbox';\n      });\n\n    if (isTask) {\n      return {\n        type: 'taskList',\n        content: items.map((li) => this.taskItemNode(li)),\n      } as unknown as TextNode;\n    }\n\n    const type = this.listType(el);\n    const node: TextNode = {\n      type,\n      content: items.map((li) => this.listItemNode(li)),\n    } as unknown as TextNode;\n\n    if (el.name === 'ol') {\n      const start = intAttr(el.attrs.start);\n      if (start != null) {\n        (node as { attrs?: { start: number } }).attrs = { start };\n      }\n    }\n    return node;\n  }\n\n  private listType(el: HtmlElement): TextNode['type'] {\n    if (el.name === 'ol') {\n      switch (el.attrs.type) {\n        case 'i':\n          return 'orderedListRomanLower';\n        case 'I':\n          return 'orderedListRoman';\n        case 'a':\n          return 'letteredListLower';\n        case 'A':\n          return 'letteredList';\n        default:\n          return 'orderedList';\n      }\n    }\n    const style = el.attrs.style ?? '';\n    if (/list-style(-type)?\\s*:\\s*none/i.test(style)) return 'noBulletList';\n    return 'bulletList';\n  }\n\n  private listItemNode(li: HtmlElement): TextNode {\n    let content = this.blockNodes(li.children);\n    if (content.length === 0) {\n      content = [{ type: 'paragraph', content: [], attrs: {} } as unknown as TextNode];\n    }\n    return { type: 'listItem', content } as unknown as TextNode;\n  }\n\n  private taskItemNode(li: HtmlElement): TextNode {\n    const checkbox = li.children.find(\n      (c): c is HtmlElement =>\n        isElement(c) && c.name === 'input' && c.attrs.type?.toLowerCase() === 'checkbox',\n    );\n    const checked = checkbox ? 'checked' in checkbox.attrs : false;\n    // Build content from the remaining children (excluding the checkbox input).\n    const rest = li.children.filter((c) => c !== checkbox);\n    let content = this.blockNodes(rest);\n    if (content.length === 0) {\n      content = [{ type: 'paragraph', content: [], attrs: {} } as unknown as TextNode];\n    }\n    return { type: 'taskItem', attrs: { checked }, content } as unknown as TextNode;\n  }\n\n  // --- images ---------------------------------------------------------------\n\n  private imageNode(el: HtmlElement, inline: boolean): TextNode {\n    const attrs: Record<string, unknown> = { src: el.attrs.src ?? '' };\n    attrs.alt = el.attrs.alt ?? null;\n    attrs.title = el.attrs.title ?? null;\n\n    const width = intAttr(el.attrs.width);\n    if (width != null) attrs.width = width;\n    const height = intAttr(el.attrs.height);\n    if (height != null) attrs.height = height;\n    if (el.attrs.class) attrs.class = el.attrs.class;\n\n    return { type: inline ? 'imageInline' : 'image', attrs } as unknown as TextNode;\n  }\n\n  // --- formulas -------------------------------------------------------------\n\n  private isMathTag(name: string): boolean {\n    return this.localName(name) === 'math';\n  }\n\n  private latexNode(el: HtmlElement): TextNode {\n    return {\n      type: 'latex',\n      attrs: {\n        formula: this.latexFromMath(el),\n      },\n    } as unknown as TextNode;\n  }\n\n  private latexFromMath(el: HtmlElement): string {\n    // Prefer explicit LaTeX from common HTML/MathML fallbacks before using visible text.\n    const alt = el.attrs.alttext ?? el.attrs.alt ?? el.attrs.title;\n    if (alt != null) return decodeEntities(alt);\n\n    const annotation = this.findLatexAnnotation(el);\n    if (annotation) return this.textContent(annotation).trim();\n\n    return this.textContent(el).trim();\n  }\n\n  private findLatexAnnotation(el: HtmlElement): HtmlElement | undefined {\n    for (const child of el.children) {\n      if (!isElement(child)) continue;\n      const lowerEncoding = (child.attrs.encoding ?? '').toLowerCase();\n      if (\n        this.localName(child.name) === 'annotation' &&\n        (/\\btex\\b/.test(lowerEncoding) || /\\blatex\\b/.test(lowerEncoding))\n      ) {\n        return child;\n      }\n      const nested = this.findLatexAnnotation(child);\n      if (nested) return nested;\n    }\n    return undefined;\n  }\n\n  private textContent(el: HtmlElement): string {\n    return el.children\n      .map((child) => (isElement(child) ? this.textContent(child) : decodeEntities(child.value)))\n      .join('')\n      .replace(/\\s+/g, ' ');\n  }\n\n  private localName(name: string): string {\n    return name.includes(':') ? name.slice(name.indexOf(':') + 1) : name;\n  }\n\n  // --- whitespace -----------------------------------------------------------\n\n  /** Trim leading/trailing whitespace from inline content (edges only). */\n  private trimInline(nodes: TextNode[]): TextNode[] {\n    const out = nodes.slice();\n    const isWs = (n: TextNode): boolean => n.type === 'text' && /^\\s*$/.test(n.text ?? '');\n\n    while (out.length > 0 && isWs(out[0])) out.shift();\n    if (out.length > 0 && out[0].type === 'text') {\n      out[0] = { ...out[0], text: (out[0].text ?? '').replace(/^\\s+/, '') };\n    }\n    while (out.length > 0 && isWs(out[out.length - 1])) out.pop();\n    if (out.length > 0 && out[out.length - 1].type === 'text') {\n      const last = out.length - 1;\n      out[last] = { ...out[last], text: (out[last].text ?? '').replace(/\\s+$/, '') };\n    }\n    return out.filter((n) => !(n.type === 'text' && n.text === ''));\n  }\n}\n","import { type PathLike } from 'node:fs';\nimport path from 'node:path';\n\nimport fs from 'fs-extra';\n\nimport { StreamWriter } from './StreamWriter.ts';\n\n/**\n * Options for file writing\n */\nexport interface FileOptions {\n  /**\n   * Append to a file if true, otherwise overwrite\n   */\n  append?: boolean;\n  /**\n   * Character encoding, defaults to 'utf8'\n   */\n  encoding?: BufferEncoding;\n}\n\n/**\n * Writer to write to a file.\n */\nclass FileWriter extends StreamWriter {\n  private _path: PathLike;\n  private _append: boolean;\n  private _encoding: BufferEncoding;\n\n  /**\n   * Create a writer to write to a file.\n   *\n   * @param path - path of file to write\n   * @param options - options for file writing\n   */\n  constructor(path: PathLike, options?: FileOptions) {\n    super();\n    const opts = Object.assign({}, options);\n\n    this._path = path;\n    this._append = !!opts.append;\n    this._encoding = opts.encoding ?? 'utf8';\n  }\n\n  public get path(): PathLike {\n    return this._path;\n  }\n\n  public get append(): boolean {\n    return this._append;\n  }\n\n  public get encoding(): BufferEncoding {\n    return this._encoding;\n  }\n\n  public async open(): Promise<void> {\n    return new Promise((resolve, reject) => {\n      const flags = this._append ? 'a' : 'w';\n\n      fs.ensureDirSync(path.dirname(this._path.toString()));\n\n      const stream = fs.createWriteStream(this._path, {\n        flags,\n        encoding: 'utf8',\n      });\n      // Set StreamWriter stream\n      this.stream = stream;\n\n      if (!stream) reject(new Error('stream undefined'));\n\n      stream.once('open', (_fd: number) => {\n        resolve();\n      });\n\n      stream.once('error', (e: Error) => {\n        reject(e);\n      });\n    });\n  }\n\n  public async close(): Promise<void> {\n    return new Promise((resolve, reject) => {\n      const stream = this.stream as NodeJS.WritableStream;\n      if (!stream) reject(new Error('stream not set'));\n\n      stream.once('close', (_fd: number) => {\n        resolve();\n      });\n      stream.once('error', (e: Error) => {\n        reject(e);\n      });\n\n      stream.end();\n    });\n  }\n}\n\nexport { FileWriter };\n","import os from 'os';\n\nimport { type Writer } from './Writer.ts';\n\n/**\n * Writer to write to a stream.\n */\nabstract class StreamWriter implements Writer {\n  private _stream: NodeJS.WritableStream | undefined;\n  public endOfLineString = os.EOL;\n  private lastWrite = '';\n\n  public get isSync() {\n    return false;\n  }\n\n  /**\n   * Get the current write stream\n   */\n  public get stream(): NodeJS.WritableStream | undefined {\n    return this._stream;\n  }\n\n  /**\n   * Set the current write stream\n   */\n  public set stream(stream: NodeJS.WritableStream | undefined) {\n    this._stream = stream;\n  }\n\n  abstract open(): Promise<void>;\n\n  abstract close(): Promise<void>;\n\n  public openSync(): void {\n    throw new Error('Sync operation not supported');\n  }\n\n  public closeSync(): void {\n    throw new Error('Sync operation not supported');\n  }\n\n  public writeLine(value?: string): this {\n    if (!this._stream) return this;\n\n    if (value != null) {\n      this._stream.write(value + this.endOfLineString);\n      this.lastWrite = value + this.endOfLineString;\n    } else {\n      this._stream.write(this.endOfLineString);\n      this.lastWrite = this.endOfLineString;\n    }\n\n    return this;\n  }\n\n  public writeLines(values: string[], delimiter?: string): this {\n    if (!this._stream) return this;\n    if (!values) return this;\n    let str = '';\n\n    for (let i = 0, len = values.length; i < len; i++) {\n      const value = values[i];\n      this._stream.write(value);\n      str += value;\n      if (delimiter && i < len - 1) {\n        this._stream.write(delimiter);\n        str += delimiter;\n      }\n      this._stream.write(this.endOfLineString);\n      str += this.endOfLineString;\n    }\n\n    this.lastWrite = str;\n\n    return this;\n  }\n\n  public write(value: string): this {\n    if (!this._stream) return this;\n    if (value == null) return this;\n    if (value) this.lastWrite = value;\n    this._stream.write(value);\n    return this;\n  }\n\n  public writeWhiteSpace(): this {\n    this.write(' ');\n    return this;\n  }\n\n  public getLastWrite(): string {\n    return this.lastWrite;\n  }\n}\n\nexport { StreamWriter };\n","import { type PathLike } from 'node:fs';\n\nimport { type FileOptions, FileWriter } from '../../ast/writer/FileWriter.ts';\nimport { SyncFileWriter } from '../../ast/writer/SyncFileWriter.ts';\nimport { type BitmarkAst } from '../../model/ast/Nodes.ts';\nimport { type Generator } from '../Generator.ts';\nimport { BitmarkGenerator, type BitmarkGeneratorOptions } from './BitmarkGenerator.ts';\n\n/**\n * Bitmark file generator options\n */\nexport interface BitmarkFileGeneratorOptions extends BitmarkGeneratorOptions {\n  /**\n   * The options for file output.\n   */\n  fileOptions?: FileOptions;\n\n  /**\n   * If true, the file will be generated asynchronously - generateSync() will throw an error.\n   * If false, the file will be generated synchronously.\n   *\n   * Defaults to false.\n   */\n  async?: boolean;\n}\n\n/**\n * Generate bitmark markup from a bitmark AST as a file\n */\nclass BitmarkFileGenerator implements Generator<BitmarkAst> {\n  private generator: BitmarkGenerator;\n  private async: boolean;\n\n  /**\n   * Generate bitmark markup from a bitmark AST as a file\n   *\n   * @param path - path of file to generate\n   * @param options - bitmark generation options\n   */\n  constructor(path: PathLike, options?: BitmarkFileGeneratorOptions) {\n    this.async = options?.async ?? false;\n    const writer = this.async\n      ? new FileWriter(path, options?.fileOptions)\n      : new SyncFileWriter(path, options?.fileOptions);\n    this.generator = new BitmarkGenerator(writer, options);\n  }\n\n  /**\n   * Generate bitmark markup from bitmark AST as a file\n   *\n   * @param ast bitmark AST\n   */\n  public async generate(ast: BitmarkAst): Promise<void> {\n    return this.generator.generate(ast);\n  }\n\n  /**\n   * Generate bitmark markup from bitmark AST as a file synchronously\n   *\n   * @param ast bitmark AST\n   */\n  public generateSync(_ast: BitmarkAst): void {\n    if (this.async) {\n      throw new Error('Sync operation not supported');\n    }\n    this.generator.generateSync(_ast);\n  }\n}\n\nexport { BitmarkFileGenerator };\n","import { type PathLike } from 'node:fs';\nimport path from 'node:path';\n\nimport fs from 'fs-extra';\nimport os from 'os';\n\n/**\n * Options for file writing\n */\nexport interface FileOptions {\n  /**\n   * Append to a file if true, otherwise overwrite\n   */\n  append?: boolean;\n  /**\n   * Character encoding, defaults to 'utf8'\n   */\n  encoding?: BufferEncoding;\n}\n\n/**\n * Writer to write to a file synchronously.\n */\nclass SyncFileWriter {\n  private _path: PathLike;\n  private _append: boolean;\n  private _encoding: BufferEncoding;\n  private _open: boolean;\n\n  public endOfLineString = os.EOL;\n  private lastWrite = '';\n\n  /**\n   * Create a writer to write to a file.\n   *\n   * @param path - path of file to write\n   * @param options - options for file writing\n   */\n  constructor(path: PathLike, options?: FileOptions) {\n    const opts = Object.assign({}, options);\n\n    this._path = path;\n    this._append = !!opts.append;\n    this._encoding = opts.encoding ?? 'utf8';\n    this._open = false;\n  }\n\n  public get isSync() {\n    return true;\n  }\n\n  public get path(): PathLike {\n    return this._path;\n  }\n\n  public get append(): boolean {\n    return this._append;\n  }\n\n  public get encoding(): BufferEncoding {\n    return this._encoding;\n  }\n\n  public async open(): Promise<void> {\n    this.openSync();\n    return Promise.resolve();\n  }\n\n  public async close(): Promise<void> {\n    try {\n      this.closeSync();\n    } catch (e) {\n      return Promise.reject(e);\n    }\n    return Promise.resolve();\n  }\n\n  public openSync(): void {\n    const flag = this._append ? 'a' : 'w';\n\n    fs.ensureDirSync(path.dirname(this._path.toString()));\n\n    fs.writeFileSync(this._path, '', {\n      flag,\n      encoding: this._encoding,\n    });\n\n    this._open = true;\n  }\n\n  public closeSync(): void {\n    this._open = false;\n  }\n\n  public writeLine(value?: string): this {\n    if (!this._open) return this;\n\n    let line: string;\n\n    if (value != null) {\n      line = value + this.endOfLineString;\n    } else {\n      line = this.endOfLineString;\n    }\n\n    // Write the line to the file\n    fs.appendFileSync(this._path, line, {\n      encoding: this._encoding,\n    });\n\n    this.lastWrite = line;\n\n    return this;\n  }\n\n  public writeLines(values: string[], delimiter?: string): this {\n    if (!this._open) return this;\n\n    if (!values) return this;\n    let str = '';\n\n    for (let i = 0, len = values.length; i < len; i++) {\n      const value = values[i];\n      str += value;\n      if (delimiter && i < len - 1) {\n        str += delimiter;\n      }\n      str += this.endOfLineString;\n    }\n\n    // Write the line to the file\n    fs.appendFileSync(this._path, str, {\n      encoding: this._encoding,\n    });\n\n    this.lastWrite = str;\n\n    return this;\n  }\n\n  public write(value: string): this {\n    if (!this._open) return this;\n    if (value == null) return this;\n    if (value) this.lastWrite = value;\n\n    // Write the line to the file\n    fs.appendFileSync(this._path, value, {\n      encoding: this._encoding,\n    });\n\n    return this;\n  }\n\n  public writeWhiteSpace(): this {\n    this.write(' ');\n    return this;\n  }\n\n  public getLastWrite(): string {\n    return this.lastWrite;\n  }\n}\n\nexport { SyncFileWriter };\n","import { type PathLike } from 'node:fs';\n\nimport { type FileOptions, FileWriter } from '../../ast/writer/FileWriter.ts';\nimport { SyncFileWriter } from '../../ast/writer/SyncFileWriter.ts';\nimport { type BitmarkAst } from '../../model/ast/Nodes.ts';\nimport { type Generator } from '../Generator.ts';\nimport { JsonGenerator, type JsonGeneratorOptions } from './JsonGenerator.ts';\n\n/**\n * JSON file generator options\n */\nexport interface JsonFileGeneratorOptions extends JsonGeneratorOptions {\n  /**\n   * The options for file output.\n   */\n  fileOptions?: FileOptions;\n\n  /**\n   * If true, the file will be generated asynchronously - generateSync() will throw an error.\n   * If false, the file will be generated synchronously.\n   *\n   * Defaults to false.\n   */\n  async?: boolean;\n}\n\n/**\n * Generate bitmark JSON from a bitmark AST as a file\n *\n */\nclass JsonFileGenerator implements Generator<BitmarkAst> {\n  private generator: JsonGenerator;\n  private async: boolean;\n\n  /**\n   * Generate bitmark JSON from a bitmark AST as a file\n   *\n   * @param path - path of file to generate\n   * @param bitmarkVersion - bitmark version, use null to use latest version\n   * @param fileOptions - file options\n   * @param bitmarkOptions - bitmark generation options\n   */\n  constructor(path: PathLike, options?: JsonFileGeneratorOptions) {\n    this.async = options?.async ?? false;\n    const writer = this.async\n      ? new FileWriter(path, options?.fileOptions)\n      : new SyncFileWriter(path, options?.fileOptions);\n    this.generator = new JsonGenerator(writer, options);\n  }\n\n  /**\n   * Generate bitmark JSON from bitmark AST as a file\n   *\n   * @param ast bitmark AST\n   */\n  public async generate(ast: BitmarkAst): Promise<void> {\n    return this.generator.generate(ast);\n  }\n\n  /**\n   * Generate bitmark JSON from bitmark AST as a file synchronously\n   *\n   * @param ast bitmark AST\n   */\n  public generateSync(_ast: BitmarkAst): void {\n    if (this.async) {\n      throw new Error('Sync operation not supported');\n    }\n    this.generator.generateSync(_ast);\n  }\n}\n\nexport { JsonFileGenerator };\n","import {\n  type FootnoteMark,\n  type ImageTextNode,\n  type LatexTextNode,\n  type LinkMark,\n  type ListTextNode,\n  type TaskItemTextNode,\n  type TextAst,\n  type TextMark,\n  type TextNode,\n} from '../../model/ast/TextNodes.ts';\nimport { TextNodeType } from '../../model/enum/TextNodeType.ts';\n\nconst TEXT_NODE_TYPES = new Set<string>(Object.values(TextNodeType));\n\n/**\n * Extracts plain text from bitmark JSON structures.\n *\n * Accepts a string (optionally JSON-encoded) or a parsed JSON value that is one of:\n * - BitWrapperJson (single or array)\n * - BitJson\n * - TextAst\n * - TextNode\n * - plain string\n *\n * Walks the structure, converts every TextNode to unformatted text, and returns\n * the concatenated result.\n */\nclass PlainTextGenerator {\n  /**\n   * Generate plain text from a string or JSON object.\n   *\n   * @param input - A string (plain or JSON-encoded) or a parsed JSON value.\n   * @returns The extracted plain text.\n   */\n  generate(input: string | unknown): string {\n    let data: unknown = input;\n\n    if (typeof data === 'string') {\n      try {\n        data = JSON.parse(data);\n      } catch (_e) {\n        // Not valid JSON – treat as a plain string\n        return data as string;\n      }\n    }\n\n    return this.walk(data).trim();\n  }\n\n  // ---------------------------------------------------------------------------\n  // Private helpers\n  // ---------------------------------------------------------------------------\n\n  private walk(value: unknown): string {\n    if (value == null) return '';\n    if (typeof value === 'string') return value;\n    if (typeof value !== 'object') return '';\n\n    if (Array.isArray(value)) {\n      if (value.length === 0) return '';\n\n      // Array of TextNodes → TextAst\n      if (this.isTextAst(value)) {\n        return this.textAstToPlainText(value as TextAst);\n      }\n\n      // Array of BitWrapperJson, or other mixed array – recurse each element\n      return value\n        .map((v) => this.walk(v))\n        .filter(Boolean)\n        .join('\\n');\n    }\n\n    const obj = value as Record<string, unknown>;\n\n    // Single TextNode\n    if (this.isTextNode(obj)) {\n      return this.textNodeToPlainText(obj as unknown as TextNode);\n    }\n\n    // BitWrapperJson – delegate to the inner bit\n    if (this.isBitWrapper(obj)) {\n      return this.walk(obj['bit']);\n    }\n\n    // Generic object (BitJson or any nested structure) – walk all values,\n    // collecting text only from structurally-detected TextNode / TextAst children.\n    const parts: string[] = [];\n    for (const val of Object.values(obj)) {\n      if (val == null || typeof val !== 'object') continue;\n\n      const text = this.walk(val);\n      if (text) parts.push(text);\n    }\n\n    return parts.join('\\n');\n  }\n\n  // -- Type guards -----------------------------------------------------------\n\n  private isTextNode(obj: Record<string, unknown>): boolean {\n    return typeof obj['type'] === 'string' && TEXT_NODE_TYPES.has(obj['type']);\n  }\n\n  private isTextAst(arr: unknown[]): boolean {\n    const first = arr[0];\n    return (\n      typeof first === 'object' &&\n      first !== null &&\n      !Array.isArray(first) &&\n      this.isTextNode(first as Record<string, unknown>)\n    );\n  }\n\n  private isBitWrapper(obj: Record<string, unknown>): boolean {\n    return (\n      'bit' in obj &&\n      typeof obj['bit'] === 'object' &&\n      obj['bit'] !== null &&\n      !Array.isArray(obj['bit'])\n    );\n  }\n\n  // -- TextNode extraction ---------------------------------------------------\n\n  private textAstToPlainText(ast: TextAst): string {\n    return ast.map((node) => this.textNodeToPlainText(node)).join('\\n');\n  }\n\n  private textNodeToPlainText(node: TextNode): string {\n    const { type, text, content } = node;\n\n    switch (type) {\n      case TextNodeType.text:\n        return this.textWithMarks(node);\n\n      case TextNodeType.hardBreak:\n        return '\\n';\n\n      // Block elements whose children are joined without extra separator\n      case TextNodeType.paragraph:\n      case TextNodeType.heading:\n      case TextNodeType.section:\n      case TextNodeType.gap:\n      case TextNodeType.select:\n      case TextNodeType.highlight:\n      case TextNodeType.mark:\n      case TextNodeType.codeBlock:\n        return content ? content.map((c) => this.textNodeToPlainText(c)).join('') : (text ?? '');\n\n      // List items are handled by listToPlainText with indent context\n      case TextNodeType.listItem:\n        return content ? content.map((c) => this.textNodeToPlainText(c)).join('') : (text ?? '');\n\n      // Task item – handled by taskListToPlainText, but fallback if encountered standalone\n      case TextNodeType.taskItem: {\n        const checked = (node as TaskItemTextNode).attrs?.checked ?? false;\n        const prefix = checked ? '[x] ' : '[ ] ';\n        const itemText = content\n          ? content.map((c) => this.textNodeToPlainText(c)).join('')\n          : (text ?? '');\n        return `${prefix}${itemText}`;\n      }\n\n      // List containers – rendered with indent-aware helper\n      case TextNodeType.noBulletList:\n      case TextNodeType.bulletList:\n      case TextNodeType.orderedList:\n      case TextNodeType.orderedListRoman:\n      case TextNodeType.orderedListRomanLower:\n      case TextNodeType.letteredList:\n      case TextNodeType.letteredListLower:\n        return this.listToPlainText(node as ListTextNode, 0);\n\n      // Task list – rendered with indent-aware helper\n      case TextNodeType.taskList:\n        return this.taskListToPlainText(node, 0);\n\n      // Images – return alt text when available\n      case TextNodeType.image:\n      case TextNodeType.imageInline: {\n        const attrs = (node as ImageTextNode).attrs;\n        return attrs?.alt ?? '';\n      }\n\n      // LaTeX – return the formula source\n      case TextNodeType.latex: {\n        const latexAttrs = (node as LatexTextNode).attrs;\n        return latexAttrs?.formula ?? '';\n      }\n\n      default:\n        return content ? content.map((c) => this.textNodeToPlainText(c)).join('') : (text ?? '');\n    }\n  }\n\n  private listToPlainText(node: ListTextNode, depth: number): string {\n    const { type, content } = node;\n    if (!content || content.length === 0) return '';\n\n    const indent = '  '.repeat(depth);\n    const start = node.attrs?.start ?? 1;\n    // Roman numeral lists use 0-based start in bitmark; adjust to 1-based for display\n    const displayStart = start < 1 ? start + 1 : start;\n\n    return content\n      .map((child, i) => {\n        const { inline, nested } = this.splitListItemContent(child, depth);\n        const prefix = this.listItemPrefix(type, displayStart + i);\n        const line = `${indent}${prefix}${inline}`;\n        return nested ? `${line}\\n${nested}` : line;\n      })\n      .join('\\n');\n  }\n\n  private taskListToPlainText(node: TextNode, depth: number): string {\n    const { content } = node;\n    if (!content || content.length === 0) return '';\n\n    const indent = '  '.repeat(depth);\n\n    return content\n      .map((child) => {\n        const checked = (child as TaskItemTextNode).attrs?.checked ?? false;\n        const prefix = checked ? '[x] ' : '[ ] ';\n        const { inline, nested } = this.splitListItemContent(child, depth);\n        const line = `${indent}${prefix}${inline}`;\n        return nested ? `${line}\\n${nested}` : line;\n      })\n      .join('\\n');\n  }\n\n  private splitListItemContent(item: TextNode, depth: number): { inline: string; nested: string } {\n    const children = item.content ?? [];\n    const inlineParts: string[] = [];\n    const nestedParts: string[] = [];\n\n    for (const child of children) {\n      if (this.isListType(child.type)) {\n        nestedParts.push(this.renderNestedList(child, depth + 1));\n      } else {\n        inlineParts.push(this.textNodeToPlainText(child));\n      }\n    }\n\n    return {\n      inline: inlineParts.join(''),\n      nested: nestedParts.join('\\n'),\n    };\n  }\n\n  private isListType(type: string): boolean {\n    return (\n      type === TextNodeType.bulletList ||\n      type === TextNodeType.orderedList ||\n      type === TextNodeType.orderedListRoman ||\n      type === TextNodeType.orderedListRomanLower ||\n      type === TextNodeType.letteredList ||\n      type === TextNodeType.letteredListLower ||\n      type === TextNodeType.noBulletList ||\n      type === TextNodeType.taskList\n    );\n  }\n\n  private renderNestedList(node: TextNode, depth: number): string {\n    if (node.type === TextNodeType.taskList) {\n      return this.taskListToPlainText(node, depth);\n    }\n    return this.listToPlainText(node as ListTextNode, depth);\n  }\n\n  private listItemPrefix(listType: ListTextNode['type'], index: number): string {\n    switch (listType) {\n      case TextNodeType.bulletList:\n        return '\\u2022 ';\n      case TextNodeType.orderedList:\n        return `${index}. `;\n      case TextNodeType.orderedListRoman:\n        return `${this.toRoman(index)}. `;\n      case TextNodeType.orderedListRomanLower:\n        return `${this.toRoman(index).toLowerCase()}. `;\n      case TextNodeType.letteredList:\n        return `${this.toLetter(index)}. `;\n      case TextNodeType.letteredListLower:\n        return `${this.toLetter(index).toLowerCase()}. `;\n      case TextNodeType.noBulletList:\n      default:\n        return '';\n    }\n  }\n\n  private toRoman(num: number): string {\n    const romanNumerals: [number, string][] = [\n      [1000, 'M'],\n      [900, 'CM'],\n      [500, 'D'],\n      [400, 'CD'],\n      [100, 'C'],\n      [90, 'XC'],\n      [50, 'L'],\n      [40, 'XL'],\n      [10, 'X'],\n      [9, 'IX'],\n      [5, 'V'],\n      [4, 'IV'],\n      [1, 'I'],\n    ];\n    let result = '';\n    let remaining = num;\n    for (const [value, numeral] of romanNumerals) {\n      while (remaining >= value) {\n        result += numeral;\n        remaining -= value;\n      }\n    }\n    return result;\n  }\n\n  private toLetter(num: number): string {\n    // 1 → A, 2 → B, ..., 26 → Z, 27 → AA, etc.\n    let result = '';\n    let remaining = num;\n    while (remaining > 0) {\n      remaining--;\n      result = String.fromCharCode(65 + (remaining % 26)) + result;\n      remaining = Math.floor(remaining / 26);\n    }\n    return result;\n  }\n\n  private textWithMarks(node: TextNode): string {\n    const { text, marks } = node;\n    const parts: string[] = [];\n\n    // Check for a link mark\n    const linkMark = marks?.find((m: TextMark) => m.type === 'link') as LinkMark | undefined;\n    const href = linkMark?.attrs?.href;\n\n    if (text && href && text !== href) {\n      // Strip protocol to get the bare domain/path form\n      const hrefBare = href.replace(/^https?:\\/\\//, '');\n      if (text.includes(hrefBare)) {\n        // The display text contains the bare URL – replace with the full URL\n        parts.push(text.replace(hrefBare, href));\n      } else if (text.includes(href)) {\n        // The display text already contains the full URL\n        parts.push(text);\n      } else {\n        // Display text is unrelated to the URL – append it\n        parts.push(`${text} ${href}`);\n      }\n    } else if (text) {\n      parts.push(text);\n    } else if (href) {\n      parts.push(href);\n    }\n\n    // Append content from marks that carry their own text (e.g. footnotes)\n    if (marks) {\n      for (const mark of marks) {\n        if (mark.type === 'footnote') {\n          const footnote = mark as unknown as FootnoteMark;\n          if (footnote.attrs?.content) {\n            const footnoteText = footnote.attrs.content\n              .map((c) => this.textNodeToPlainText(c))\n              .join('');\n            if (footnoteText) parts.push(footnoteText);\n          }\n        }\n      }\n    }\n\n    return parts.join(' ');\n  }\n}\n\nexport { PlainTextGenerator };\n","import path from 'node:path';\n\nimport { Enum } from '@ncoderz/superenum';\nimport fs from 'fs-extra';\n\nimport { Config } from '../config/Config.ts';\nimport { BITS } from '../config/raw/bits.ts';\nimport { CARDS } from '../config/raw/cardSets.ts';\nimport { GROUPS } from '../config/raw/groups.ts';\nimport type {\n  _AbstractTagConfig,\n  _BitConfig,\n  _GroupsConfig,\n  ExportJsonKey,\n  HtmlKey,\n} from '../model/config/_Config.ts';\nimport { typeFromConfigKey } from '../model/config/enum/ConfigKey.ts';\nimport { BitTagConfigKeyType } from '../model/enum/BitTagConfigKeyType.ts';\nimport { BitType, type BitTypeType } from '../model/enum/BitType.ts';\nimport { TagFormat } from '../model/enum/TagFormat.ts';\nimport { TextFormat } from '../model/enum/TextFormat.ts';\nimport { StringUtils } from '../utils/StringUtils.ts';\n\n/**\n * Config generation options for the parser\n */\nexport interface GenerateConfigOptions {\n  outputDir?: string;\n}\n\nconst normalizeCardKey = (cardSetKey: string): string => StringUtils.camelToKebab(cardSetKey);\n\nclass ConfigBuilder {\n  public build(options?: GenerateConfigOptions): void {\n    const opts: GenerateConfigOptions = Object.assign({}, options);\n\n    const bitConfigs: (_BitConfig & { bitType: BitTypeType })[] = [];\n    const groupConfigs: (_GroupsConfig & { key: string })[] = [];\n\n    const bitGroupConfigKeys: Set<BitTypeType> = new Set();\n    const bitGroupConfigs: (_BitConfig & { bitType: BitTypeType })[] = [];\n\n    // First pass: collect all bits that are inherited from (walk full chains)\n    for (const bt of Enum(BitType).values()) {\n      const bitType = Config.getBitType(bt);\n      const _bitConfig = BITS[bitType] as _BitConfig;\n      if (_bitConfig?.baseBitType) {\n        // Walk up the inheritance chain and add all ancestors\n        let currentBitType: BitTypeType | undefined = _bitConfig.baseBitType;\n        while (currentBitType) {\n          bitGroupConfigKeys.add(currentBitType);\n          const parentConfig = BITS[currentBitType] as _BitConfig;\n          currentBitType = parentConfig?.baseBitType;\n        }\n      }\n    }\n\n    for (const bt of Enum(BitType).values()) {\n      const bitType = Config.getBitType(bt);\n      const _bitConfig: _BitConfig & { bitType: BitTypeType } = BITS[bitType] as _BitConfig & {\n        bitType: BitTypeType;\n      };\n      if (_bitConfig) {\n        _bitConfig.bitType = bitType;\n        bitConfigs.push(_bitConfig);\n      }\n      // const config: BitConfig = Config.getBitConfig(bitType);\n      // bitConfigs.push(config);\n    }\n    for (const [k, g] of Object.entries(GROUPS)) {\n      const g2 = g as unknown as _GroupsConfig & { key: string };\n      let k2 = k as string;\n      if (k.startsWith('group_')) k2 = k2.substring(6);\n      k2 = /*'_' +*/ StringUtils.camelToKebab(k2);\n      g2.key = k2;\n      groupConfigs.push(g2);\n    }\n    const outputFolder = opts.outputDir ?? 'assets/config';\n    const outputFolderBits = path.join(outputFolder, 'bits');\n    const outputFolderGroups = path.join(outputFolder, 'groups');\n    const outputFolderCards = path.join(outputFolder, 'cards');\n    fs.ensureDirSync(outputFolderBits);\n    fs.ensureDirSync(outputFolderGroups);\n    fs.ensureDirSync(outputFolderCards);\n\n    // Clean up existing config files\n    const bitsFiles = fs.readdirSync(outputFolderBits).filter((f) => f.endsWith('.jsonc'));\n    for (const file of bitsFiles) {\n      fs.removeSync(path.join(outputFolderBits, file));\n    }\n    const partialsFiles = fs.readdirSync(outputFolderGroups).filter((f) => f.endsWith('.jsonc'));\n    for (const file of partialsFiles) {\n      fs.removeSync(path.join(outputFolderGroups, file));\n    }\n    const cardsFiles = fs.readdirSync(outputFolderCards).filter((f) => f.endsWith('.jsonc'));\n    for (const file of cardsFiles) {\n      fs.removeSync(path.join(outputFolderCards, file));\n    }\n    const fileWrites: Promise<void>[] = [];\n    const tagEntriesTypeOrder = [\n      BitTagConfigKeyType.tag,\n      BitTagConfigKeyType.property,\n      BitTagConfigKeyType.resource,\n      BitTagConfigKeyType.group,\n      BitTagConfigKeyType.unknown,\n    ];\n\n    // Validator errors collected during tag processing — listed back to the user\n    // in heading-style paths matching JSONKEYMIGRATION.md.\n    const exportJsonKeyErrors: string[] = [];\n\n    // Helper to resolve group references through squash map (handles chained squashing)\n    type GroupRef = {\n      key: string;\n      jsonKey?: string;\n      exportJsonKey?: ExportJsonKey;\n      hasExportJsonKey?: boolean;\n      htmlKey?: HtmlKey;\n      hasHtmlKey?: boolean;\n      extraKeys?: MappingKeysRecord;\n      min?: number | string;\n      max?: number | string;\n      description?: string;\n    };\n    const resolveGroupReferences = (groupKey: string): GroupRef[] => {\n      if (squashedGroups.has(groupKey)) {\n        const replacements = squashedGroups.get(groupKey)!;\n        // Recursively resolve in case of chained squashing.\n        // If a replacement itself is squashed, its own min/max/description are\n        // discarded (it's being replaced); otherwise keep them on the leaf ref.\n        return replacements.flatMap((r) =>\n          squashedGroups.has(r.key) ? resolveGroupReferences(r.key) : [r],\n        );\n      }\n      return [{ key: groupKey }];\n    };\n\n    // The emitted `mappingKeys` record: members keyed by mapping-type id\n    // (`json`, `html`, plus named mappings like `xml-niso-iec` carried\n    // verbatim from the raw config's `mappingKeys` field). A null value\n    // means \"no key\" and is never emitted; an empty record is omitted\n    // entirely. `base` seeds the record with the raw named mappings; the\n    // json/html members (from exportJsonKey/htmlKey) overlay it.\n    type MappingKeysRecord = Record<string, unknown>;\n    const mappingKeysField = (\n      base: MappingKeysRecord | undefined,\n      json: { value?: unknown; present: boolean },\n      html: { value?: unknown; present: boolean },\n    ): { mappingKeys: MappingKeysRecord } | object => {\n      const record: MappingKeysRecord = {};\n      for (const [id, value] of Object.entries(base ?? {})) {\n        if (value != null) record[id] = value;\n      }\n      if (json.present && json.value != null) record.json = json.value;\n      if (html.present && html.value != null) record.html = html.value;\n      return Object.keys(record).length > 0 ? { mappingKeys: record } : {};\n    };\n\n    // Default-form bare key for property/resource entries: '@bookReferences' → 'bookReferences'.\n    // Symbol-mapped tags (#, +, -, _, =, %, ?, !, ▼, ►, $, ##) and dotted/transformed\n    // legacy jsonKeys are NOT default and require an explicit exportJsonKey.\n    const bareKeyForProperty = (key: string): string | undefined => {\n      if (key.startsWith('@') || key.startsWith('&')) return key.substring(1);\n      return undefined;\n    };\n    const legacyIsTrivialDefault = (tag: _AbstractTagConfig): boolean => {\n      const bare = bareKeyForProperty(tag.key as string);\n      if (bare == null) return false; // symbol-mapped, group, etc. — never trivial default\n      // No explicit jsonKey, or explicit jsonKey is exactly the bare name.\n      return tag.jsonKey == null || tag.jsonKey === bare;\n    };\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const processTagEntries = (tag: any, pathStack: string[]): any[] => {\n      const tags: unknown[] = [];\n      let tagName = tag.key as string;\n      const tagType = typeFromConfigKey(tag.key);\n      let format = '';\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      let chain: any = undefined;\n\n      // Tag value formats use the stored vocabulary directly\n      // (string | boolean | bitmark+ | number | coordinates); `string` is the\n      // natural default and is omitted on emission.\n      if (tagType === BitTagConfigKeyType.tag) {\n        tagName = tag.key;\n        if (tag.format === TagFormat.plainText) {\n          format = 'string';\n        } else if (tag.format === TagFormat.boolean) {\n          format = 'boolean';\n        } else if (tag.format === TagFormat.number) {\n          format = 'number';\n        } else {\n          // bitmarkText and unspecified: tag text parses as bitmark+ either way.\n          format = 'bitmark+';\n        }\n      } else if (tagType === BitTagConfigKeyType.property) {\n        tagName = tag.key;\n        if (tag.format === TagFormat.plainText) {\n          format = 'string';\n        } else if (tag.format === TagFormat.boolean) {\n          format = 'boolean';\n        } else if (tag.format === TagFormat.bitmarkText) {\n          format = 'bitmark+';\n        } else if (tag.format === TagFormat.number) {\n          format = 'number';\n        } else if (tag.format === TagFormat.coordinates) {\n          format = 'coordinates';\n        }\n      } else if (tagType === BitTagConfigKeyType.resource) {\n        format = 'string';\n      } else if (tagType === BitTagConfigKeyType.group) {\n        let k = tag.key as string;\n        if (k.startsWith('group_')) k = k.substring(6);\n        k = StringUtils.camelToKebab(k);\n        const resolvedGroups = resolveGroupReferences(k);\n        const hasOuterExport = Object.prototype.hasOwnProperty.call(tag, 'exportJsonKey');\n        const hasOuterHtml = Object.prototype.hasOwnProperty.call(tag, 'htmlKey');\n        // Validator: a group reference may carry a per-site jsonKey override\n        // (legacy mini-language string). If it does, it must have an\n        // exportJsonKey companion — otherwise the override would be silently\n        // dropped on emission.\n        if (!hasOuterExport && tag.jsonKey != null) {\n          const headingPath = [...pathStack, `tags.${tag.key}`].join(' / ');\n          exportJsonKeyErrors.push(\n            `Missing exportJsonKey for non-default jsonKey at ${headingPath} (legacy: \\`${tag.jsonKey}\\`)`,\n          );\n        }\n        for (const ref of resolvedGroups) {\n          // Outer tag's exportJsonKey/jsonKey/min/max/description override the squashed leaf's.\n          const exportJsonKeyChosen = hasOuterExport ? tag.exportJsonKey : ref.exportJsonKey;\n          const hasExportChosen = hasOuterExport || !!ref.hasExportJsonKey;\n          const htmlKeyChosen = hasOuterHtml ? tag.htmlKey : ref.htmlKey;\n          const hasHtmlChosen = hasOuterHtml || !!ref.hasHtmlKey;\n          const min = tag.minCount != null ? tag.minCount : ref.min;\n          const max = tag.maxCount != null ? tag.maxCount : ref.max;\n          const description = tag.description ? tag.description : ref.description;\n          tags.push({\n            type: 'group',\n            key: ref.key,\n            ...mappingKeysField(\n              { ...(ref.extraKeys ?? {}), ...(tag.mappingKeys ?? {}) },\n              { value: exportJsonKeyChosen, present: hasExportChosen },\n              { value: htmlKeyChosen, present: hasHtmlChosen },\n            ),\n            ...(min != null ? { min } : {}),\n            ...(max != null ? { max } : {}),\n            ...(description ? { description } : {}),\n          });\n        }\n        return tags;\n      }\n\n      // Process chain\n      if (Array.isArray(tag.chain) && tag.chain.length > 0) {\n        const chainTags: unknown[] = [];\n        const childPathStack = [...pathStack, `tags.${tag.key}`];\n        for (const [, chainTag] of tag.chain.entries()) {\n          chainTags.push(...processTagEntries(chainTag, childPathStack));\n        }\n        chain = chainTags;\n      }\n\n      // The json member comes from exportJsonKey; absent is only valid for\n      // trivially-default keys (validator below). The html member has no\n      // legacy companion and no validator: emitted verbatim when explicitly\n      // set (data-* fallback applies downstream — see HTML.md §5).\n      const hasExport = Object.prototype.hasOwnProperty.call(tag, 'exportJsonKey');\n      if (!hasExport && !legacyIsTrivialDefault(tag)) {\n        // Validator failure: legacy non-default jsonKey with no exportJsonKey.\n        const headingPath = [...pathStack, `tags.${tag.key}`].join(' / ');\n        exportJsonKeyErrors.push(\n          `Missing exportJsonKey for non-default jsonKey at ${headingPath}` +\n            (tag.jsonKey ? ` (legacy: \\`${tag.jsonKey}\\`)` : ` (symbol-mapped tag \\`${tag.key}\\`)`),\n        );\n      }\n      const hasHtml = Object.prototype.hasOwnProperty.call(tag, 'htmlKey');\n\n      const t = {\n        type: 'tag',\n        key: tagName,\n        ...mappingKeysField(\n          tag.mappingKeys as MappingKeysRecord | undefined,\n          { value: tag.exportJsonKey as ExportJsonKey, present: hasExport },\n          { value: tag.htmlKey as HtmlKey, present: hasHtml },\n        ),\n        ...(format && format !== 'string' ? { format } : {}),\n        ...(tag.defaultValue != null ? { default: tag.defaultValue } : {}),\n        ...(tag.nullable ? { nullable: true } : {}),\n        ...(tag.minCount != null && tag.minCount !== 0 ? { min: tag.minCount } : {}),\n        ...(tag.maxCount != null && tag.maxCount !== 1 ? { max: tag.maxCount } : {}),\n        description: tag.description ?? '',\n        tags: chain,\n      };\n      tags.push(t);\n      return tags;\n    };\n\n    // For card-set / side / variant / section: build the `mappingKeys` record.\n    // json member from the exportJsonKey companion (validator-fail when a\n    // non-null legacy jsonKey exists without one); html member emitted\n    // verbatim when explicitly set (no legacy companion, no validator —\n    // HTML.md §5).\n    const cardMappingKeysField = (\n      container: object,\n      base: MappingKeysRecord | undefined,\n      legacyKey: 'jsonKey' | 'sideJsonKey',\n      exportKey: 'exportJsonKey' | 'sideExportJsonKey',\n      htmlExportKey: 'htmlKey' | 'sideHtmlKey',\n      pathHeading: string,\n    ): { mappingKeys: MappingKeysRecord } | object => {\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const c = container as any;\n      const hasExport = Object.prototype.hasOwnProperty.call(c, exportKey);\n      if (!hasExport && c[legacyKey] != null) {\n        // Non-null legacy with no exportJsonKey → validator failure\n        exportJsonKeyErrors.push(\n          `Missing exportJsonKey for non-default jsonKey at ${pathHeading} (legacy: \\`${c[legacyKey]}\\`)`,\n        );\n      }\n      return mappingKeysField(\n        base,\n        { value: c[exportKey], present: hasExport },\n        {\n          value: c[htmlExportKey],\n          present: Object.prototype.hasOwnProperty.call(c, htmlExportKey),\n        },\n      );\n    };\n\n    const serializeCardSet = (\n      cardSetKey: string,\n    ):\n      | {\n          name: string;\n          mappingKeys?: MappingKeysRecord;\n          cards: {\n            name: string;\n            isDefault?: boolean;\n            mappingKeys?: MappingKeysRecord;\n            sides: {\n              name: string;\n              repeat?: boolean;\n              mappingKeys?: MappingKeysRecord;\n              variants: unknown[];\n            }[];\n          }[];\n        }\n      | undefined => {\n      const variantBodyFormat = (variant: { format?: string }): string =>\n        variant.format ?? TextFormat.bitmarkText;\n      const cardSetConfig = CARDS[cardSetKey];\n      if (!cardSetConfig) return undefined;\n      const normalizedKey = normalizeCardKey(cardSetKey);\n\n      // Variants have no \"inherited-group wrapper\" the way bits do\n      // (`writeBitConfigs` always emits a parent `group-{baseBitType}` ref\n      // first, then sorted own tags). Without that wrapper, sorting variant\n      // tags with groups LAST means inherited generic tags (from a group ref\n      // inside the variant) get walked AFTER any direct tag/property\n      // override and overwrite it under the downstream configurator's\n      // last-wins-by-name dedup. Sort groups FIRST so direct overrides win.\n      const variantTagEntriesTypeOrder = [\n        BitTagConfigKeyType.group,\n        BitTagConfigKeyType.tag,\n        BitTagConfigKeyType.property,\n        BitTagConfigKeyType.resource,\n        BitTagConfigKeyType.unknown,\n      ];\n      const sides = cardSetConfig.sides.map((side, sideIdx) => {\n        const sidePath = `cardSets.${normalizedKey} / sides.${side.name ?? `[${sideIdx}]`}`;\n        const variants = side.variants.map((variant, variantIdx) => {\n          const variantPath = `${sidePath} / variants.[${variantIdx}]`;\n          const variantTags: unknown[] = [];\n          const variantTagEntries = Object.entries(variant.tags ?? []).sort((a, b) => {\n            const tagA = a[1];\n            const tagB = b[1];\n            const typeA = typeFromConfigKey(tagA.key);\n            const typeB = typeFromConfigKey(tagB.key);\n            const typeOrder =\n              variantTagEntriesTypeOrder.indexOf(typeA) - variantTagEntriesTypeOrder.indexOf(typeB);\n            return typeOrder;\n          });\n\n          for (const [, variantTag] of variantTagEntries) {\n            variantTags.push(...processTagEntries(variantTag, [variantPath]));\n          }\n\n          return {\n            ...cardMappingKeysField(\n              variant,\n              undefined,\n              'jsonKey',\n              'exportJsonKey',\n              'htmlKey',\n              variantPath,\n            ),\n            bodyFormat: variantBodyFormat(variant),\n            tags: variantTags,\n            ...(variant.repeatCount != null && variant.repeatCount !== 1\n              ? { repeatCount: variant.repeatCount }\n              : {}),\n            ...(variant.bodyRequired ? { bodyRequired: true } : {}),\n            ...(variant.bodyAllowed === false ? { bodyForbidden: true } : {}),\n          };\n        });\n\n        return {\n          name: side.name,\n          ...(side.repeat ? { repeat: side.repeat } : {}),\n          ...cardMappingKeysField(\n            side,\n            side.mappingKeys,\n            'jsonKey',\n            'exportJsonKey',\n            'htmlKey',\n            sidePath,\n          ),\n          variants,\n        };\n      });\n\n      // When sections exist, each section becomes its own card entry\n      if (cardSetConfig.sections) {\n        const cards = Object.entries(cardSetConfig.sections).map(([sectionName, section]) => {\n          const sectionPath = `cardSets.${normalizedKey} / cards.${sectionName}`;\n          // Per-section override of the side mapping keys (when\n          // section.sideExportJsonKey / legacy section.sideJsonKey /\n          // section.sideHtmlKey is set). Overrides merge member-wise into\n          // each side's record; an explicit null clears that member.\n          const hasSideExport = Object.prototype.hasOwnProperty.call(section, 'sideExportJsonKey');\n          const hasSideHtml = Object.prototype.hasOwnProperty.call(section, 'sideHtmlKey');\n          let cardSides = sides;\n          if (hasSideExport || section.sideJsonKey != null || hasSideHtml) {\n            if (!hasSideExport && section.sideJsonKey != null) {\n              exportJsonKeyErrors.push(\n                `Missing exportJsonKey for non-default jsonKey at ${sectionPath} / sides.* (legacy: \\`${section.sideJsonKey}\\`)`,\n              );\n            }\n            cardSides = sides.map((s) => {\n              const record: MappingKeysRecord = { ...(s.mappingKeys ?? {}) };\n              if (hasSideExport) {\n                if (section.sideExportJsonKey != null) record.json = section.sideExportJsonKey;\n                else delete record.json;\n              }\n              if (hasSideHtml) {\n                if (section.sideHtmlKey != null) record.html = section.sideHtmlKey;\n                else delete record.html;\n              }\n              return {\n                name: s.name,\n                ...(s.repeat ? { repeat: s.repeat } : {}),\n                ...(Object.keys(record).length > 0 ? { mappingKeys: record } : {}),\n                variants: s.variants,\n              };\n            });\n          }\n\n          return {\n            name: sectionName,\n            ...(section.isDefault ? { isDefault: true } : {}),\n            ...cardMappingKeysField(\n              section,\n              section.mappingKeys,\n              'jsonKey',\n              'exportJsonKey',\n              'htmlKey',\n              sectionPath,\n            ),\n            // PLAN-085: per-section cardinality. Emit only when non-default\n            // (treat `0` / undefined as \"unbounded — omit\").\n            ...(section.minCount != null && section.minCount !== 0\n              ? { min: section.minCount }\n              : {}),\n            ...(section.maxCount != null && section.maxCount !== 0\n              ? { max: section.maxCount }\n              : {}),\n            sides: cardSides,\n          };\n        });\n\n        // The card-set container key (e.g. the `<table>` wrapper for tables —\n        // HTML.md §8) has no slot in the sectioned shape the way single-card\n        // sets do, so emit it here at the top level. Only the html member is\n        // emitted (legacy jsonKey/exportJsonKey for sectioned roots is\n        // intentionally omitted, preserving existing JSON output).\n        return {\n          name: normalizedKey,\n          ...mappingKeysField(\n            undefined,\n            { present: false },\n            {\n              value: (cardSetConfig as { htmlKey?: HtmlKey }).htmlKey,\n              present: Object.prototype.hasOwnProperty.call(cardSetConfig, 'htmlKey'),\n            },\n          ),\n          cards,\n        };\n      }\n\n      // Single card\n      const cardSetPath = `cardSets.${normalizedKey} / cards.default`;\n      return {\n        name: normalizedKey,\n        cards: [\n          {\n            name: 'default',\n            isDefault: true,\n            ...cardMappingKeysField(\n              cardSetConfig,\n              cardSetConfig.mappingKeys,\n              'jsonKey',\n              'exportJsonKey',\n              'htmlKey',\n              cardSetPath,\n            ),\n            sides,\n          },\n        ],\n      };\n    };\n\n    // Convert bits that are depended on to groups (must happen before writing bit configs)\n    for (const bt of bitGroupConfigKeys) {\n      const bitType = Config.getBitType(bt);\n      const _bitConfig: _BitConfig & { bitType: BitTypeType } = BITS[bitType] as _BitConfig & {\n        bitType: BitTypeType;\n      };\n      if (_bitConfig) {\n        _bitConfig.bitType = bitType;\n        // Avoid duplicates\n        if (!bitGroupConfigs.some((c) => c.bitType === bitType)) {\n          bitGroupConfigs.push(_bitConfig);\n        }\n      }\n    }\n\n    // Calculate which bit-groups should be squashed (only contain group references, no actual tags)\n    // Maps: groupKey -> array of replacement group refs (with min/max/description preserved)\n    const squashedGroups: Map<string, GroupRef[]> = new Map();\n\n    for (const b of bitGroupConfigs) {\n      const groupKey = `group-${b.bitType}`;\n      const processedTags: unknown[] = [];\n\n      // Process this bit's own tags (not parent)\n      for (const [, tag] of Object.entries(b.tags ?? [])) {\n        processedTags.push(...processTagEntries(tag, []));\n      }\n\n      // Check if all processed tags are group references\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      const allAreGroups = processedTags.every((t: any) => t.type === 'group');\n\n      if (allAreGroups && processedTags.length > 0) {\n        // This group should be squashed - collect all its group references,\n        // preserving min/max/description from each occurrence so they survive\n        // the squash and reach the final emitted bit config.\n        const replacements: GroupRef[] = [];\n        if (b.baseBitType) {\n          // Note: We'll resolve this later through resolveGroupReferences recursion\n          replacements.push({ key: `group-${b.baseBitType}` });\n        }\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        for (const t of processedTags as any[]) {\n          // The processed group tag carries a `mappingKeys` record (json\n          // member already an exportJsonKey value at this point). Preserve\n          // presence semantics: if a member is present on the processed tag,\n          // mark it so a downstream resolveGroupReferences emits the same\n          // value.\n          const ref: GroupRef = {\n            key: t.key,\n            ...(t.min != null ? { min: t.min } : {}),\n            ...(t.max != null ? { max: t.max } : {}),\n            ...(t.description ? { description: t.description } : {}),\n          };\n          const record = (t.mappingKeys ?? {}) as MappingKeysRecord;\n          if (Object.prototype.hasOwnProperty.call(record, 'json')) {\n            ref.exportJsonKey = record.json as ExportJsonKey;\n            ref.hasExportJsonKey = true;\n          }\n          if (Object.prototype.hasOwnProperty.call(record, 'html')) {\n            ref.htmlKey = record.html as HtmlKey;\n            ref.hasHtmlKey = true;\n          }\n          const extras = Object.fromEntries(\n            Object.entries(record).filter(([id]) => id !== 'json' && id !== 'html'),\n          );\n          if (Object.keys(extras).length > 0) ref.extraKeys = extras;\n          replacements.push(ref);\n        }\n        squashedGroups.set(groupKey, replacements);\n      }\n    }\n\n    // BitConfigs\n    for (const b of bitConfigs) {\n      // Get the resolved bit config with inherited properties\n      const resolvedBitConfig = Config.getBitConfig(b.bitType);\n\n      const tags: unknown[] = [];\n      const tagEntries = Object.entries(b.tags ?? []).sort((a, b) => {\n        const tagA = a[1];\n        const tagB = b[1];\n        const typeA = typeFromConfigKey(tagA.key);\n        const typeB = typeFromConfigKey(tagB.key);\n        const typeOrder = tagEntriesTypeOrder.indexOf(typeA) - tagEntriesTypeOrder.indexOf(typeB);\n        return typeOrder;\n      });\n      const isInheritedFrom = bitGroupConfigKeys.has(b.bitType);\n\n      // Per-key dedup with in-place replacement, mirroring\n      // ConfigHydrator.hydrateTagsConfig's last-wins-per-configKey semantic\n      // (PLAN-066). Walk order = parent inheritance chain (root → leaf) →\n      // each level's tagGroupRefs[] → direct tags[] last; when the same\n      // `key` reappears later in the walk, it REPLACES the earlier entry\n      // in place (preserving position). Without this, the downstream\n      // configurator-api importer hits a UNIQUE(bit_id, group_id)\n      // violation on the second attach and silently keeps the first\n      // (inherited) entry, losing the child's override.\n      const indexByKey = new Map<string, number>();\n      const pushOrReplace = (entry: { key: string; [k: string]: unknown }) => {\n        const existing = indexByKey.get(entry.key);\n        if (existing !== undefined) {\n          tags[existing] = entry;\n        } else {\n          indexByKey.set(entry.key, tags.length);\n          tags.push(entry);\n        }\n      };\n\n      if (isInheritedFrom) {\n        // This bit is inherited from, so its tags are in group-<bitType>\n        // The bit config only references its own group (resolved through squash map)\n        const resolvedGroups = resolveGroupReferences(`group-${b.bitType}`);\n        for (const ref of resolvedGroups) {\n          pushOrReplace({\n            type: 'group',\n            key: ref.key,\n            ...mappingKeysField(\n              ref.extraKeys,\n              { value: ref.exportJsonKey, present: !!ref.hasExportJsonKey },\n              { value: ref.htmlKey, present: !!ref.hasHtmlKey },\n            ),\n            ...(ref.min != null ? { min: ref.min } : {}),\n            ...(ref.max != null ? { max: ref.max } : {}),\n            ...(ref.description ? { description: ref.description } : {}),\n          });\n        }\n      } else {\n        // This is a leaf bit - include parent group reference + own tags\n        if (b.baseBitType) {\n          const resolvedGroups = resolveGroupReferences(`group-${b.baseBitType}`);\n          for (const ref of resolvedGroups) {\n            pushOrReplace({\n              type: 'group',\n              key: ref.key,\n              ...mappingKeysField(\n                ref.extraKeys,\n                { value: ref.exportJsonKey, present: !!ref.hasExportJsonKey },\n                { value: ref.htmlKey, present: !!ref.hasHtmlKey },\n              ),\n              ...(ref.min != null ? { min: ref.min } : {}),\n              ...(ref.max != null ? { max: ref.max } : {}),\n              ...(ref.description ? { description: ref.description } : {}),\n            });\n          }\n        }\n        for (const [_tagKey, tag] of tagEntries) {\n          for (const entry of processTagEntries(tag, [])) {\n            pushOrReplace(entry as { key: string; [k: string]: unknown });\n          }\n        }\n      }\n\n      // Walk up the baseBitType chain to find the inherited cardSet\n      let cardRef: string | undefined;\n      let current: _BitConfig | undefined = b;\n      while (current) {\n        if (current.cardSet && CARDS[current.cardSet]) {\n          cardRef = normalizeCardKey(current.cardSet as string);\n          break;\n        }\n        current = current.baseBitType ? (BITS[current.baseBitType] as _BitConfig) : undefined;\n      }\n\n      // Use resolved values from BitConfig (with inheritance applied).\n      // Flags are omitted at their natural defaults; `bodyFormat` keeps the\n      // full text-format fidelity (`bitmark++`/`bitmark--`); no fabricated\n      // `history` (the raw config carries none — the field stays supported\n      // for hand-authored provenance).\n      const bitJson = {\n        name: b.bitType,\n        description: b.description ?? '',\n        since: resolvedBitConfig.since,\n        deprecated: resolvedBitConfig.deprecated,\n        bodyFormat: resolvedBitConfig.textFormatDefault ?? 'bitmark--',\n        ...(resolvedBitConfig.bodyRequired ? { bodyRequired: true } : {}),\n        ...(resolvedBitConfig.bodyAllowed === false ? { bodyForbidden: true } : {}),\n        ...(resolvedBitConfig.footerRequired ? { footerRequired: true } : {}),\n        ...(resolvedBitConfig.footerAllowed === false ? { footerForbidden: true } : {}),\n        ...(resolvedBitConfig.resourceAttachmentAllowed === false\n          ? { resourceAttachmentAllowed: false }\n          : {}),\n        // Bit-level named key mappings (element keys for markup import),\n        // carried verbatim from the raw config.\n        ...mappingKeysField(b.mappingKeys, { present: false }, { present: false }),\n        tags,\n        ...(cardRef ? { cardSet: cardRef } : {}),\n      };\n      const output = path.join(outputFolderBits, `${b.bitType}.jsonc`);\n      const str = JSON.stringify(bitJson, null, 2);\n      fileWrites.push(fs.writeFile(output, str));\n      // const bitType = b.bitType;\n      // const bitType2 = Config.getBitType(bitType);\n      // if (bitType !== bitType2) {\n      //   console.log(`BitType: ${bitType} => ${bitType2}`);\n      // }\n    }\n\n    // GroupConfigs\n    const writeGroupConfigs = (groupConfigs: (_GroupsConfig & { key: string })[]) => {\n      for (const g of groupConfigs) {\n        const tags: unknown[] = [];\n        const groupKey = StringUtils.camelToKebab(g.key);\n        // if (groupKey == '_resourceImage') debugger;\n        const tagEntriesTypeOrder = [\n          BitTagConfigKeyType.tag,\n          BitTagConfigKeyType.property,\n          BitTagConfigKeyType.resource,\n          BitTagConfigKeyType.group,\n        ];\n        const tagEntries = Object.entries(g.tags ?? []).sort((a, b) => {\n          const tagA = a[1];\n          const tagB = b[1];\n          const typeOrder =\n            tagEntriesTypeOrder.indexOf(tagA.type) - tagEntriesTypeOrder.indexOf(tagB.type);\n          return typeOrder;\n        });\n        for (const [_tagKey, tag] of tagEntries) {\n          tags.push(...processTagEntries(tag, []));\n        }\n        const bitJson = {\n          name: groupKey,\n          description: g.description ?? '',\n          deprecated: g.deprecated,\n          tags,\n          // cards: [\n          //   {\n          //     card: null,\n          //     side: 1,\n          //     variant: null,\n          //     description: '',\n          //     tags: [],\n          //   },\n          //   {\n          //     card: null,\n          //     side: 2,\n          //     variant: 1,\n          //     description: '',\n          //     tags: [],\n          //   },\n          //   {\n          //     card: null,\n          //     side: 2,\n          //     variant: null,\n          //     description: '',\n          //     tags: [],\n          //   },\n          // ],\n        };\n        const output = path.join(outputFolderGroups, `${groupKey}.jsonc`);\n        const str = JSON.stringify(bitJson, null, 2);\n        fs.writeFileSync(output, str);\n        // const bitType = b.bitType;\n        // const bitType2 = Config.getBitType(bitType);\n        // if (bitType !== bitType2) {\n        //   console.log(`BitType: ${bitType} => ${bitType2}`);\n        // }\n      }\n    };\n    writeGroupConfigs(groupConfigs);\n\n    const writeCardConfigs = () => {\n      for (const cardSetKey of Object.keys(CARDS)) {\n        const cardJson = serializeCardSet(cardSetKey);\n        if (!cardJson) continue;\n        const output = path.join(outputFolderCards, `${cardJson.name}.jsonc`);\n        const str = JSON.stringify(cardJson, null, 2);\n        fileWrites.push(fs.writeFile(output, str));\n      }\n    };\n\n    // Bits as GroupConfigs\n    const writeBitsAsGroupConfigs = (\n      bitsAsGroupConfigs: (_BitConfig & { bitType: BitTypeType })[],\n    ) => {\n      for (const b of bitsAsGroupConfigs) {\n        const groupKey = `group-${b.bitType}`;\n\n        // Skip squashed groups - they won't be written as files\n        if (squashedGroups.has(groupKey)) {\n          continue;\n        }\n\n        const tags: unknown[] = [];\n\n        // Add reference to parent group if this bit has a baseBitType (resolved through squash map)\n        if (b.baseBitType) {\n          const resolvedGroups = resolveGroupReferences(`group-${b.baseBitType}`);\n          for (const ref of resolvedGroups) {\n            tags.push({\n              type: 'group',\n              key: ref.key,\n              ...mappingKeysField(\n                ref.extraKeys,\n                { value: ref.exportJsonKey, present: !!ref.hasExportJsonKey },\n                { value: ref.htmlKey, present: !!ref.hasHtmlKey },\n              ),\n              ...(ref.min != null ? { min: ref.min } : {}),\n              ...(ref.max != null ? { max: ref.max } : {}),\n              ...(ref.description ? { description: ref.description } : {}),\n            });\n          }\n        }\n\n        const tagEntries = Object.entries(b.tags ?? []).sort((a, b) => {\n          const tagA = a[1];\n          const tagB = b[1];\n          const typeA = typeFromConfigKey(tagA.key);\n          const typeB = typeFromConfigKey(tagB.key);\n          const typeOrder = tagEntriesTypeOrder.indexOf(typeA) - tagEntriesTypeOrder.indexOf(typeB);\n          return typeOrder;\n        });\n        for (const [_tagKey, tag] of tagEntries) {\n          tags.push(...processTagEntries(tag, []));\n        }\n        const bitJson = {\n          name: groupKey,\n          description: b.description ?? '',\n          deprecated: b.deprecated,\n          tags,\n        };\n        const output = path.join(outputFolderGroups, `${groupKey}.jsonc`);\n        const str = JSON.stringify(bitJson, null, 2);\n        fs.writeFileSync(output, str);\n        // const bitType = b.bitType;\n        // const bitType2 = Config.getBitType(bitType);\n        // if (bitType !== bitType2) {\n        //   console.log(`BitType: ${bitType} => ${bitType2}`);\n        // }\n      }\n    };\n    writeBitsAsGroupConfigs(bitGroupConfigs);\n\n    writeCardConfigs();\n\n    // Fail fast on missing exportJsonKey before any file write — this is a\n    // source-config error and the on-disk output would be wrong.\n    if (exportJsonKeyErrors.length > 0) {\n      console.error('\\n⚠️  exportJsonKey validation errors:');\n      for (const e of exportJsonKeyErrors) console.error(`  - ${e}`);\n      throw new Error(\n        `exportJsonKey validation failed: ${exportJsonKeyErrors.length} entr${\n          exportJsonKeyErrors.length === 1 ? 'y' : 'ies'\n        } with non-default jsonKey but no exportJsonKey companion.`,\n      );\n    }\n\n    // Wait for all async file writes to complete, then validate\n    Promise.all(fileWrites)\n      .then(() => {\n        // Validate the config tree after all files are written\n        const validationErrors = this.validateConfigTree(outputFolder);\n        if (validationErrors.length > 0) {\n          console.error('\\n⚠️  Config tree validation errors:');\n          for (const error of validationErrors) {\n            console.error(`  - ${error}`);\n          }\n          throw new Error(`Config tree validation failed with ${validationErrors.length} error(s)`);\n        } else {\n          console.log('✅ Config tree validation passed');\n        }\n      })\n      .catch((err) => {\n        console.error('Error during config build or validation:', err);\n        throw err;\n      });\n  }\n\n  /**\n   * Validate the config tree for missing group references\n   * @param outputFolder - The folder containing the config files\n   * @returns Array of validation errors, empty if valid\n   */\n  private validateConfigTree(outputFolder: string): string[] {\n    const errors: string[] = [];\n    const outputFolderBits = path.join(outputFolder, 'bits');\n    const outputFolderGroups = path.join(outputFolder, 'groups');\n    const outputFolderCards = path.join(outputFolder, 'cards');\n\n    // Read all group files to build a set of available groups\n    const availableGroups = new Set<string>();\n    if (fs.existsSync(outputFolderGroups)) {\n      const groupFiles = fs.readdirSync(outputFolderGroups).filter((f) => f.endsWith('.jsonc'));\n      for (const file of groupFiles) {\n        const groupName = file.replace('.jsonc', '');\n        availableGroups.add(groupName);\n      }\n    }\n\n    const availableCards = new Set<string>();\n    const cardFiles = fs.existsSync(outputFolderCards)\n      ? fs.readdirSync(outputFolderCards).filter((f) => f.endsWith('.jsonc'))\n      : [];\n    for (const file of cardFiles) {\n      const cardName = file.replace('.jsonc', '');\n      availableCards.add(cardName);\n    }\n\n    // Helper to recursively check tags for group references\n    const checkTags = (tags: unknown[], filePath: string, lineOffset: number): void => {\n      for (let i = 0; i < tags.length; i++) {\n        const tag = tags[i] as { type?: string; key?: string; tags?: unknown[] };\n        if (tag?.type === 'group' && tag.key) {\n          if (!availableGroups.has(tag.key)) {\n            const line = lineOffset + i + 1; // Approximate line number\n            errors.push(`Missing group reference '${tag.key}' in ${filePath}:${line}`);\n          }\n        }\n        // Recursively check nested tags\n        if (Array.isArray(tag?.tags)) {\n          checkTags(tag.tags, filePath, lineOffset + i + 1);\n        }\n      }\n    };\n\n    // Check all bit config files\n    if (fs.existsSync(outputFolderBits)) {\n      const bitFiles = fs.readdirSync(outputFolderBits).filter((f) => f.endsWith('.jsonc'));\n      for (const file of bitFiles) {\n        const filePath = path.join(outputFolderBits, file);\n        try {\n          const content = fs.readFileSync(filePath, 'utf-8');\n          const config = JSON.parse(content);\n          if (config.tags && Array.isArray(config.tags)) {\n            checkTags(config.tags, `bits/${file}`, 15); // Approximate line offset for tags array\n          }\n          if (typeof config.card === 'string') {\n            if (!availableCards.has(config.card)) {\n              errors.push(`Missing card file '${config.card}' referenced in bits/${file}`);\n            }\n          } else if (config.card?.sides && Array.isArray(config.card.sides)) {\n            config.card.sides.forEach((side: unknown, sideIdx: number) => {\n              const variants = (side as { variants?: unknown[] }).variants;\n              if (Array.isArray(variants)) {\n                variants.forEach((variant: unknown, variantIdx: number) => {\n                  const variantTags = (variant as { tags?: unknown[] }).tags;\n                  if (Array.isArray(variantTags)) {\n                    checkTags(\n                      variantTags,\n                      `bits/${file} (card side ${sideIdx}, variant ${variantIdx})`,\n                      15,\n                    );\n                  }\n                });\n              }\n            });\n          }\n        } catch (err) {\n          errors.push(`Failed to parse ${file}: ${err}`);\n        }\n      }\n    }\n\n    // Check all group config files\n    if (fs.existsSync(outputFolderGroups)) {\n      const groupFiles = fs.readdirSync(outputFolderGroups).filter((f) => f.endsWith('.jsonc'));\n      for (const file of groupFiles) {\n        const filePath = path.join(outputFolderGroups, file);\n        try {\n          const content = fs.readFileSync(filePath, 'utf-8');\n          const config = JSON.parse(content);\n          if (config.tags && Array.isArray(config.tags)) {\n            checkTags(config.tags, `groups/${file}`, 15); // Approximate line offset for tags array\n          }\n        } catch (err) {\n          errors.push(`Failed to parse ${file}: ${err}`);\n        }\n      }\n    }\n\n    if (cardFiles.length > 0) {\n      for (const file of cardFiles) {\n        const filePath = path.join(outputFolderCards, file);\n        try {\n          const content = fs.readFileSync(filePath, 'utf-8');\n          const config = JSON.parse(content);\n          const expectedKey = file.replace('.jsonc', '');\n          if (config.key && config.key !== expectedKey) {\n            errors.push(`Card key mismatch in cards/${file}: expected '${expectedKey}'`);\n          }\n          if (Array.isArray(config.cards)) {\n            for (const cardNode of config.cards) {\n              if (cardNode && Array.isArray(cardNode.sides)) {\n                cardNode.sides.forEach((side: unknown, sideIdx: number) => {\n                  const variants = (side as { variants?: unknown[] }).variants;\n                  if (Array.isArray(variants)) {\n                    variants.forEach((variant: unknown, variantIdx: number) => {\n                      const variantTags = (variant as { tags?: unknown[] }).tags;\n                      if (Array.isArray(variantTags)) {\n                        checkTags(\n                          variantTags,\n                          `cards/${file} (side ${sideIdx}, variant ${variantIdx})`,\n                          10,\n                        );\n                      }\n                    });\n                  }\n                });\n              }\n            }\n          }\n        } catch (err) {\n          errors.push(`Failed to parse cards/${file}: ${err}`);\n        }\n      }\n    }\n\n    return errors;\n  }\n}\n\nexport { ConfigBuilder };\n","import { StringWriter } from '../../ast/writer/StringWriter.ts';\nimport { type BitmarkAst } from '../../model/ast/Nodes.ts';\nimport { type Generator } from '../Generator.ts';\nimport { JsonGenerator, type JsonGeneratorOptions } from './JsonGenerator.ts';\n\n/**\n * Generate bitmark JSON from a bitmark AST as a string\n */\nclass JsonStringGenerator implements Generator<BitmarkAst, string> {\n  private generator: JsonGenerator;\n  private writer: StringWriter;\n\n  /**\n   * Generate bitmark JSON from a bitmark AST as a string\n   *\n   * @param options - JSON generation options\n   */\n  constructor(options?: JsonGeneratorOptions) {\n    this.writer = new StringWriter();\n    this.generator = new JsonGenerator(this.writer, options);\n  }\n\n  /**\n   * Generate bitmark JSON from bitmark AST as a string\n   *\n   * @param ast bitmark AST\n   */\n  public async generate(ast: BitmarkAst): Promise<string> {\n    await this.generator.generate(ast);\n    return this.writer.getString();\n  }\n\n  /**\n   * Generate bitmark JSON from bitmark AST as a string synchronously\n   *\n   * @param ast bitmark AST\n   */\n  public generateSync(ast: BitmarkAst): string {\n    this.generator.generateSync(ast);\n    return this.writer.getString();\n  }\n}\n\nexport { JsonStringGenerator };\n","import { BitmarkParserGenerator, Output } from '../BitmarkParserGenerator.ts';\nimport { type BitJson } from '../model/json/BitJson.ts';\nimport { type BitWrapperJson } from '../model/json/BitWrapperJson.ts';\n\n/** Axis-aligned bounding box: `[x0, y0, x1, y1]` (top-left + bottom-right). */\ntype Bbox = [number, number, number, number];\n\ninterface BoundingBoxEntry {\n  bit: BitJson;\n  wrapper: BitWrapperJson;\n  /** Normalized list of boxes parsed from `bit.sourceBB` (always at least one). */\n  boxes: Bbox[];\n}\n\ninterface FromBitsOptions {\n  /**\n   * If provided, only include bits whose `bit.sourceRL` exactly equals this\n   * value. Bits with no `sourceRL` are excluded.\n   */\n  sourceRL?: string;\n}\n\nfunction toBbox(arr: unknown): Bbox | null {\n  if (!Array.isArray(arr) || arr.length !== 4) return null;\n  if (!arr.every(Number.isFinite)) return null;\n  return [arr[0], arr[1], arr[2], arr[3]];\n}\n\nfunction parseSourceBB(sourceBB: BitJson['sourceBB']): Bbox[] {\n  if (sourceBB == null) return [];\n  if (!Array.isArray(sourceBB) || sourceBB.length === 0) return [];\n\n  // Use some() rather than sourceBB[0] so an undefined/invalid first element\n  // doesn't mask valid nested tuples that follow it (mirrors Builder.normaliseSourceBB).\n  const isNested = (sourceBB as unknown[]).some(Array.isArray);\n\n  const candidates = isNested ? (sourceBB as unknown[]) : [sourceBB];\n  const out: Bbox[] = [];\n  for (const candidate of candidates) {\n    const box = toBbox(candidate);\n    if (box) out.push(box);\n  }\n  return out;\n}\n\nfunction boundingBoxIntersects(a: Bbox, b: Bbox): boolean {\n  return a[0] < b[2] && a[2] > b[0] && a[1] < b[3] && a[3] > b[1];\n}\n\nfunction boundingBoxUnion(boxes: Bbox[]): Bbox | null {\n  if (boxes.length === 0) return null;\n  let [x0, y0, x1, y1] = boxes[0];\n  for (let i = 1; i < boxes.length; i++) {\n    const b = boxes[i];\n    if (b[0] < x0) x0 = b[0];\n    if (b[1] < y0) y0 = b[1];\n    if (b[2] > x1) x1 = b[2];\n    if (b[3] > y1) y1 = b[3];\n  }\n  return [x0, y0, x1, y1];\n}\n\n/**\n * Index over a list of bits with `@sourceBB` tags, designed for live region\n * selection in a browser (e.g. the user drags a box and the preview updates\n * as they go). Each bit's `sourceBB` is parsed once at construction so that\n * intersection queries are pure bounding-box scans on the hot path.\n */\nclass BoundingBoxIndex {\n  private readonly _entries: BoundingBoxEntry[];\n  private readonly bitmarkParser = new BitmarkParserGenerator();\n\n  private constructor(entries: BoundingBoxEntry[]) {\n    this._entries = entries;\n  }\n\n  /**\n   * Build an index from already-parsed bits. Bits without a parseable\n   * `sourceBB` are dropped. Order of the input is preserved.\n   *\n   * Pass `options.sourceRL` to scope the index to a single source page —\n   * bits whose `sourceRL` doesn't match (or is absent) are excluded.\n   */\n  static fromBits(wrappers: BitWrapperJson[], options?: FromBitsOptions): BoundingBoxIndex {\n    const filterSourceRL = options?.sourceRL;\n    const entries: BoundingBoxEntry[] = [];\n    for (const wrapper of wrappers) {\n      if (!wrapper?.bit) continue;\n      if (filterSourceRL !== undefined && wrapper.bit.sourceRL !== filterSourceRL) {\n        continue;\n      }\n      const boxes = parseSourceBB(wrapper.bit.sourceBB);\n      if (boxes.length === 0) continue;\n      entries.push({ bit: wrapper.bit, wrapper, boxes });\n    }\n    return new BoundingBoxIndex(entries);\n  }\n\n  /** All bits with at least one valid `sourceBB`, in input order. */\n  get entries(): ReadonlyArray<BoundingBoxEntry> {\n    return this._entries;\n  }\n\n  /**\n   * Bits whose ANY `sourceBB` box intersects `query` (strict overlap —\n   * touching-only edges do NOT count as an intersection).\n   */\n  intersecting(query: Bbox): BoundingBoxEntry[] {\n    const matches: BoundingBoxEntry[] = [];\n    for (const entry of this._entries) {\n      if (entry.boxes.some((box) => boundingBoxIntersects(query, box))) {\n        matches.push(entry);\n      }\n    }\n    return matches;\n  }\n\n  /**\n   * Flat list of every individual `sourceBB` box that intersects `query`.\n   * For a multi-box bit, only the boxes that themselves intersected are\n   * returned.\n   */\n  intersectingBoxes(query: Bbox): Bbox[] {\n    const matches: Bbox[] = [];\n    for (const entry of this._entries) {\n      for (const box of entry.boxes) {\n        if (boundingBoxIntersects(query, box)) matches.push(box);\n      }\n    }\n    return matches;\n  }\n\n  /**\n   * Smallest axis-aligned box that fully encloses every individual `sourceBB`\n   * box that intersected the query. For a multi-box bit, only the boxes that\n   * themselves intersected contribute to the union — non-intersecting boxes\n   * from the same bit are ignored. Returns `null` if no box matches.\n   */\n  enclosingBoundingBox(query: Bbox): Bbox | null {\n    return boundingBoxUnion(this.intersectingBoxes(query));\n  }\n\n  /** Render selected bits back to bitmark text. Empty input returns `''`. */\n  toBitmark(entries: BoundingBoxEntry[]): string {\n    if (entries.length === 0) return '';\n    const wrappers = entries.map((e) => e.wrapper);\n    return this.bitmarkParser.convert(wrappers, {\n      outputFormat: Output.bitmark,\n      bitmarkOptions: { prettifyJson: true },\n    }) as string;\n  }\n}\n\nexport { BoundingBoxIndex };\nexport type { Bbox, BoundingBoxEntry, FromBitsOptions };\n"],"mappings":"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AS;AACf,QAAM,SAAS;AACf,QAAM,SAAS;AACf,QAAM,SAAS;AACf,QAAM,SAAS;AACf,QAAM,SAAS;AACf,QAAM,SAAS;AACf,QAAM,SAAS;AACf,QAAM,SAAS;AACf,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,QAAM,UAAU;AAChB,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","names":["import_superenum","import_superenum","import_superenum","import_superenum","import_superenum","import_superenum","import_superenum","import_superenum","import_superenum","tags","tags","import_superenum","import_superenum","import_superenum","import_superenum","import_superenum","tags","path","objs","clone","import_superenum","tags","tags","instance","import_superenum","import_superenum","i","import_superenum","import_superenum","import_superenum","import_superenum","import_superenum","import_superenum","import_superenum","import_superenum","Breakscape","instance","import_superenum","instance","instance","import_superenum","import_superenum","href","s","instance","instance","s","expected","found","start","location","text","offset","instance","instance","instance","instance","import_superenum","instance","document","instance","instance","tags","index","path","parser","import_superenum","import_superenum","import_superenum","DEFAULT_OPTIONS","instance","tags","import_superenum","DEFAULT_OPTIONS","instance","r","parser","import_superenum","instance","import_superenum","import_superenum","import_superenum","import_superenum","parser","instance","import_superenum","import_superenum","instance","parser","value","import_superenum","import_superenum","instance","tags","data","instance","textParser","instance","parser","instance","tags","__isDefaultExample","example","heading","textParser","instance","textParser","instance","import_superenum","textParser","instance","instance","import_superenum","textParser","instance","instance","import_superenum","instance","tags","import_superenum","tags","instance","textParser","instance","tags","import_superenum","instance","tags","import_superenum","instance","tags","tags","instance","textParser","tags","instance","tags","instance","tags","instance","textParser","instance","v","instance","import_superenum","instance","tags","textParser","instance","textParser","instance","instance","tags","ENABLE_DEBUG","DEBUG_DATA","DEBUG_DATA_INCLUDE_PARSER","DEBUG","builder","instance","tags","parser","peg$SyntaxError","s","expected","found","peg$parse","location","text","offset","parse","peg$parse","parse","import_node_path","import_fs_extra","os","path","fs","import_node_fs","import_node_fs","import_node_path","import_fs_extra","import_os","path","os","fs","path","import_node_fs","path","import_node_path","import_superenum","import_fs_extra","instance","path","fs","tags","b","groupConfigs","tagEntriesTypeOrder","builder","instance","fs","path","isString","parser","outputFormat","json"]}